【问题标题】:How do I refer to a class with a Symbol in Ruby?如何在 Ruby 中引用带有符号的类?
【发布时间】:2014-12-26 18:07:40
【问题描述】:

我想创建一个哈希,其键引用一个类的符号,值一些数组,例如,引用该特定类的颜色。截至目前,我的实现是这样的:

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")

【问题讨论】:

  • “用符号引用类”是什么意思?您可以使用任何东西作为哈希键,包括类。
  • 在设计方面,AnimalColours 包含哪些动物可以是哪种颜色的代码并没有真正的意义。该代码应该放在相应的动物类中。 AnimalColours 应该只包含对所有颜色通用的代码。
  • 为什么要转换成符号?在这种情况下,字符串同样可以正常工作,并不是说它会产生巨大的影响,但是符号会因为它们被冻结而消耗更多的内存,并且永远不会被 GC 拾取。虽然因为它们在 class_variable 中,但它并不重要,因为它也不会被 GC 处理。不过对于那些关心seesm 2.2.0 的人来说,这可能是个好消息GC Symbols created outside the C-level
  • @Max,我想拥有一个包含所有动物颜色的容器,所以动物类可以从该类中选择自己的,因为事实上,动物的颜色是额外的, 并没有真正与类的特性挂钩
  • 为什么要不断地在类和符号之间来回转换?为什么不直接使用类作为键?

标签: ruby class hash symbols


【解决方案1】:

您可以使用字符串而不是符号作为哈希的键。 您可以使用class.name 访问类的名称(字符串)。

我想如果你想让它们成为符号,你可以调用 class.name.to_sym 并将键设置为,例如,:Dog。请注意,前导冒号后的符号与类名相同。

【讨论】:

  • 他们可以使用类本身作为哈希键(如果他们先声明类)。
  • 我想使用符号,因为据我所知,它们在迭代方面比字符串快,例如
  • @user3452637 这种微优化不是 Ruby 的意义所在。无论如何,也有符号比字符串更糟糕的情况。除了也许更快之外,你需要一个更好的理由来选择它们。
猜你喜欢
  • 2015-12-02
  • 2019-10-31
  • 2012-06-27
  • 1970-01-01
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
相关资源
最近更新 更多