ruby - রুবি মধ্যে Enums



(17)

রুবিতে enum idiom বাস্তবায়ন করার সেরা উপায় কী? আমি এমন কিছু খুঁজছেন যা আমি ব্যবহার করতে পারি (প্রায়) জাভা / সি # enums মত।

https://src-bin.com


Answer #1

Ruby-enum মণি পরীক্ষা করে দেখুন, https://github.com/dblock/ruby-enum

class Gender
  include Enum

  Gender.define :MALE, "male"
  Gender.define :FEMALE, "female"
end

Gender.all
Gender::MALE


Answer #3

আমার মনে হয় গণিতের ধরনগুলি বাস্তবায়ন করার সর্বোত্তম উপায় প্রতীকগুলির সাথে, কারণ পূর্ণসংখ্যা হিসাবে অনেকগুলি আচরণ করা হয় (যখন এটি সঞ্চালনের জন্য আসে, object_id তুলনা করতে ব্যবহৃত হয়); আপনি সূচী সম্পর্কে চিন্তা করতে হবে না এবং তারা আপনার কোড xD সত্যিই পরিষ্কার দেখতে


Answer #4

আমি অবাক হচ্ছি যে কেউ নীচের মত কিছু প্রস্তাব করেনি ( RAPI মণির থেকে সংগ্রহ করা হয়েছে):

class Enum

  private

  def self.enum_attr(name, num)
    name = name.to_s

    define_method(name + '?') do
      @attrs & num != 0
    end

    define_method(name + '=') do |set|
      if set
        @attrs |= num
      else
        @attrs &= ~num
      end
    end
  end

  public

  def initialize(attrs = 0)
    @attrs = attrs
  end

  def to_i
    @attrs
  end
end

যা তাই ব্যবহার করা যেতে পারে:

class FileAttributes < Enum
  enum_attr :readonly,       0x0001
  enum_attr :hidden,         0x0002
  enum_attr :system,         0x0004
  enum_attr :directory,      0x0010
  enum_attr :archive,        0x0020
  enum_attr :in_rom,         0x0040
  enum_attr :normal,         0x0080
  enum_attr :temporary,      0x0100
  enum_attr :sparse,         0x0200
  enum_attr :reparse_point,  0x0400
  enum_attr :compressed,     0x0800
  enum_attr :rom_module,     0x2000
end

উদাহরণ:

>> example = FileAttributes.new(3)
=> #<FileAttributes:0x629d90 @attrs=3>
>> example.readonly?
=> true
>> example.hidden?
=> true
>> example.system?
=> false
>> example.system = true
=> true
>> example.system?
=> true
>> example.to_i
=> 7

এটি ডেটাবেস পরিস্থিতিতে ভাল বা সি স্টাইল স্টোনেন্টস / এনমের সাথে আচরণ করে (যেমন FFI ব্যবহার করে, যা RAPI ব্যাপক ব্যবহার করে)।

এছাড়াও, আপনি টাইপগুলির বিষয়ে নীরব ব্যর্থতার কারণ সম্পর্কে চিন্তা করতে হবে না, যেমন আপনি হ্যাশ-টাইপ সমাধানটি ব্যবহার করতে চান।


Answer #5

আমি নিম্নলিখিত পদ্ধতি ব্যবহার করি:

class MyClass
  MY_ENUM = [MY_VALUE_1 = 'value1', MY_VALUE_2 = 'value2']
end

আমি নিম্নলিখিত সুবিধার জন্য এটি পছন্দ করি:

  1. এটি গোষ্ঠী একটি পুরো হিসাবে দৃষ্টিভঙ্গি মূল্য
  2. এটি কিছু সংকলন-সময় পরীক্ষণ (কেবল প্রতীক ব্যবহার করে বিপরীতে)
  3. আমি সহজে সমস্ত সম্ভাব্য মানগুলির তালিকা অ্যাক্সেস করতে পারি: শুধু MY_ENUM
  4. আমি সহজেই স্বতন্ত্র মানগুলি অ্যাক্সেস করতে পারি: MY_VALUE_1
  5. এটি যেকোনো ধরনের মান থাকতে পারে, কেবলমাত্র প্রতীক নয়

প্রতীকগুলি আরও ভালো হতে পারে কারণ আপনি বাইরের শ্রেণীর নাম লেখার প্রয়োজন নেই, যদি আপনি এটি অন্য শ্রেণীতে ব্যবহার করেন ( MyClass::MY_VALUE_1 )


Answer #6

আমি যে মত enums বাস্তবায়িত হয়েছে

module EnumType

  def self.find_by_id id
    if id.instance_of? String
      id = id.to_i
    end 
    values.each do |type|
      if id == type.id
        return type
      end
    end
    nil
  end

  def self.values
    [@ENUM_1, @ENUM_2] 
  end

  class Enum
    attr_reader :id, :label

    def initialize id, label
      @id = id
      @label = label
    end
  end

  @ENUM_1 = Enum.new(1, "first")
  @ENUM_2 = Enum.new(2, "second")

end

তারপর অপারেশন করতে সহজ

EnumType.ENUM_1.label

...

enum = EnumType.find_by_id 1

...

valueArray = EnumType.values

Answer #7

এই রুবি মধ্যে enums আমার পদ্ধতির। আমি ছোট এবং মিষ্টি জন্য যাচ্ছে, অগত্যা সবচেয়ে সি মত। কোন চিন্তা?

module Kernel
  def enum(values)
    Module.new do |mod|
      values.each_with_index{ |v,i| mod.const_set(v.to_s.capitalize, 2**i) }

      def mod.inspect
        "#{self.name} {#{self.constants.join(', ')}}"
      end
    end
  end
end

States = enum %w(Draft Published Trashed)
=> States {Draft, Published, Trashed} 

States::Draft
=> 1

States::Published
=> 2

States::Trashed
=> 4

States::Draft | States::Trashed
=> 3

Answer #8

এটি একটু অপ্রাসঙ্গিক মনে হচ্ছে, কিন্তু এটি একটি পদ্ধতি যা আমি কয়েক বার ব্যবহার করেছি, বিশেষত যেখানে আমি XML বা এরকম কিছু সংহত করছি।

#model
class Profession
  def self.pro_enum
    {:BAKER => 0, 
     :MANAGER => 1, 
     :FIREMAN => 2, 
     :DEV => 3, 
     :VAL => ["BAKER", "MANAGER", "FIREMAN", "DEV"]
    }
  end
end

Profession.pro_enum[:DEV]      #=>3
Profession.pro_enum[:VAL][1]   #=>MANAGER

এটি আমাকে AC # enum এর কঠোরতা দেয় এবং এটি মডেলের সাথে যুক্ত।


Answer #9

এটি নির্ভর করে আপনি কিভাবে জাভা বা সি # enums ব্যবহার করেন। আপনি কিভাবে এটি ব্যবহার করবেন রুবিতে আপনি যে সমাধানটি চয়ন করবেন তা নির্দেশ করবে।

উদাহরণস্বরূপ, স্থানীয় Set টাইপ ব্যবহার করে দেখুন:

>> enum = Set['a', 'b', 'c']
=> #<Set: {"a", "b", "c"}>
>> enum.member? "b"
=> true
>> enum.member? "d"
=> false
>> enum.add? "b"
=> nil
>> enum.add? "d"
=> #<Set: {"a", "b", "c", "d"}>

Answer #10

কখনও কখনও আমার প্রয়োজন হয় enum এর মান আনা এবং জাভা বিশ্বের অনুরূপ তার নাম সনাক্ত করতে সক্ষম।

module Enum
     def get_value(str)
       const_get(str)
     end
     def get_name(sym)
       sym.to_s.upcase
     end
 end

 class Fruits
   include Enum
   APPLE = "Delicious"
   MANGO = "Sweet"
 end

 Fruits.get_value('APPLE') #'Delicious'
 Fruits.get_value('MANGO') # 'Sweet'

 Fruits.get_name(:apple) # 'APPLE'
 Fruits.get_name(:mango) # 'MANGO'

এই আমার enum উদ্দেশ্য পরিবেশন করে এবং এটি খুব এক্সটেনসিবল রাখে। আপনি Enum ক্লাসে আরো পদ্ধতি যুক্ত করতে পারেন এবং লঙ্ঘনগুলি সমস্ত সংজ্ঞায়িত enums এ তাদের বিনামূল্যে পেতে পারেন। উদাহরণ স্বরূপ. get_all_names এবং যে মত স্টাফ।


Answer #11

প্রতীক রুবি উপায়। যাইহোক, কখনও কখনও কিছু সি কোড বা কিছু বা জাভাতে কথা বলতে হবে যা বিভিন্ন জিনিসের জন্য কিছু enum প্রকাশ করে।

#server_roles.rb
module EnumLike

  def EnumLike.server_role
    server_Symb=[ :SERVER_CLOUD, :SERVER_DESKTOP, :SERVER_WORKSTATION]
    server_Enum=Hash.new
    i=0
    server_Symb.each{ |e| server_Enum[e]=i; i +=1}
    return server_Symb,server_Enum
  end

end

এই তারপর এই ভালো ব্যবহার করা যেতে পারে

require 'server_roles'

sSymb, sEnum =EnumLike.server_role()

foreignvec[sEnum[:SERVER_WORKSTATION]]=8

এই অবশ্যই বিমূর্ত করা যেতে পারে এবং আপনি আমাদের নিজস্ব Enum ক্লাস রোল করতে পারেন


Answer #12

বেশিরভাগ লোকেরা প্রতীক ব্যবহার করে (যেটি :foo_bar সিনট্যাক্স)। তারা অনন্য opaque মান সাজানোর। সিম্বলগুলি কোনও এননাম-স্টাইল টাইপের অন্তর্গত নয়, তাই এটি আসলে সি এর এনমের টাইপের বিশ্বস্ত উপস্থাপনা নয় তবে এটি যতটা ভাল পায় ততই ভাল।


Answer #13

রুবি ক্লাসে ব্লগে অন্য রুচি ক্লাস ব্যবহার করা হাশের নাম এবং মূল্য রয়েছে যা নিম্নোক্ত RubyFleebie ব্লগ পোস্টে বর্ণিত হয়েছে। এটি আপনাকে মান এবং স্থিরতার মধ্যে সহজেই রূপান্তর করতে দেয় (বিশেষ করে যদি আপনি একটি প্রদত্ত মানের নামটি সন্ধান করার জন্য একটি ক্লাস পদ্ধতি যোগ করেন)।


Answer #14

সম্প্রতি আমরা একটি gem মুক্ত করেছিলাম যা রুবিতে এ্যানামস প্রয়োগ করে। আমার post আপনি আপনার প্রশ্নের উত্তর পাবেন। এছাড়াও আমি সেখানে বর্ণনা করেছি কেন আমাদের বাস্তবায়ন বিদ্যমানগুলির তুলনায় ভাল (আসলে রবিতে এই বৈশিষ্ট্যটির অনেকগুলি বাস্তবায়ন এখনও রত্ন হিসাবে আছে)।


Answer #15

সামঞ্জস্যপূর্ণ সমানতা হ্যান্ডলিংয়ের সাথে একটি enum অনুকরণ করার আরেকটি উপায় (লজ্জাজনকভাবে ডেভ থমাস থেকে গৃহীত)। খোলা enums (চিহ্ন মত অনেক) এবং বন্ধ (পূর্বনির্ধারিত) enums অনুমতি দেয়।

class Enum
  def self.new(values = nil)
    enum = Class.new do
      unless values
        def self.const_missing(name)
          const_set(name, new(name))
        end
      end

      def initialize(name)
        @enum_name = name
      end

      def to_s
        "#{self.class}::#@enum_name"
      end
    end

    if values
      enum.instance_eval do
        values.each { |e| const_set(e, enum.new(e)) }
      end
    end

    enum
  end
end

Genre = Enum.new %w(Gothic Metal) # creates closed enum
Architecture = Enum.new           # creates open enum

Genre::Gothic == Genre::Gothic        # => true
Genre::Gothic != Architecture::Gothic # => true

Answer #16

দুটো রাস্তা. প্রতীক ( :foo নোটেশন) বা FOO ( FOO উল্লেখ)।

যখন আপনি আক্ষরিক স্ট্রিংগুলির সাথে কোড টিচার ছাড়াই পঠনযোগ্যতা বৃদ্ধি করতে চান তখন প্রতীকগুলি উপযুক্ত।

postal_code[:minnesota] = "MN"
postal_code[:new_york] = "NY"

আপনি একটি অন্তর্নিহিত মান গুরুত্বপূর্ণ যখন Constants উপযুক্ত। শুধু আপনার স্থিরতা রাখা একটি মডিউল ঘোষণা করুন এবং তারপরে যে মধ্যে সংস্থিত ঘোষণা।

module Foo
  BAR = 1
  BAZ = 2
  BIZ = 4
end

flags = Foo::BAR | Foo::BAZ # flags = 3

Answer #17
irb(main):016:0> num=[1,2,3,4]
irb(main):017:0> alph=['a','b','c','d']
irb(main):018:0> l_enum=alph.to_enum
irb(main):019:0> s_enum=num.to_enum
irb(main):020:0> loop do
irb(main):021:1* puts "#{s_enum.next} - #{l_enum.next}"
irb(main):022:1> end

আউটপুট:

1 - একটি
2 - খ
3 - গ
4 - ডি





enums