2014-10-30 47 views
0

我想做一個哈希鍵,它指的是一個類的符號和一些數組的值,例如,指向那個特定類的顏色。到目前爲止,我的實現是這樣的:如何在Ruby中引用帶有Symbol的類?

module DomesticAnimal 
    attr_accessor :name 

    def eat(food) 
     puts "Eating #{food}" 
    end 
end 

module AnimalColours #Lo separo para realizar más abstracción 
    @@colours = { 
     :dog => ["White", "Grey", "Black", "Brown"], 
     :cat => ["White", "Black"], 
    } 

    def self.hasColour(type, colour) 
     if @@colours[type] != nil 
      @@colours[type].each do |x| 
       return true unless x != colour 
      end 
     end 
     return false 
    end 
end 

class Dog 
    include DomesticAnimal 

    def initialize(name, colour) 
     @name = name 

     if AnimalColours.hasColour(:dog, colour) 
      @colour = colour 
     else 
      raise "Colour error" 
     end 
    end 

    def goOut(place) 
     puts "#{name} when out for a walk to #{place}" 
    end 
end 

dog = Dog.new("Juan", "Black") 

dog.goOut("the park") 
+1

你是指「用符號引用一個類」是什麼意思?你可以使用任何東西作爲散列鍵,包括一個類。 – 2014-10-30 15:53:36

+1

從設計角度來看,「AnimalColours」包含的動物可以是哪種顏色的代碼並沒有意義。該代碼應該在各自的動物類中進行。 'AnimalColours'應該只包含通用於_all_顏色的代碼。 – Max 2014-10-30 17:03:23

+1

爲什麼要轉換爲符號?在這種情況下,字符串同樣可以發揮作用,而不會產生巨大的影響,但符號在被凍結時會消耗更多的內存,並且不會被GC所接收。雖然由於它們處於class_variable中,所以它不會太重要,因爲它不會被GC'd所佔用。雖然對於那些看護2.2.0的人來說可能會很好[在C級以外創建的GC符號](https://bugs.ruby-lang.org/issues/9634) – engineersmnky 2014-10-30 17:50:25

回答

0

您可以使用字符串作爲散列鍵而不是符號。 您可以使用class.name訪問類(字符串)的名稱。

我想如果你想讓它們成爲符號,你可以打電話class.name.to_sym,並有鑰匙,例如,:Dog。請注意,引號冒號後的符號與類名稱相同。

+0

他們可以使用類本身作爲散列鍵(如果它們首先聲明類)。 – Max 2014-10-30 17:04:08

+0

我想要使用符號,因爲正如我所知道的那樣,它們比迭代的字符串更快,例如 – gibarsin 2014-10-30 22:08:18

+0

@ user3452637這種微型優化不是Ruby的意思。無論如何,也有符號比字符串更糟的情況。除了它可能會更快,你需要更好的理由來選擇它們。 – Max 2014-10-30 22:47:02

相關問題