1

我一直试图从一篇博客文章中理解这个示例 Ruby 代码,该文章说它使用符号 :DEFAULT、:say 和 :@message “查找标识符”。但据我所知,它不是查找标识符,而是查找与这些标识符关联的值。我认为标识符是变量、方法等的名称。所以标识符应该是“ DEFAULT ”、“ say ”和“ message ”?程序的输出如下。

另外,为什么需要查找标识符?

class Demo
  # The stuff we'll look up.
  DEFAULT = "Hello"
  def initialize
    @message = DEFAULT
  end
  def say() @message end

  # Use symbols to look up identifiers.
  def look_up_with_symbols
    [Demo.const_get(:DEFAULT),
     method(:say),
     instance_variable_get(:@message)]
  end
end

dem = Demo.new
puts dem.look_up_with_symbols

当我运行代码时,我得到这个输出:

Hello
#<Method: Demo#say>
Hello
4

2 回答 2

2

示例代码使用符号来获取三件事:DEFAULTconst 的值(通过 访问:DEFAULT)、方法对象(通过 访问:say)和实例变量的值(通过 访问:@message)。这三个对象都不是使用符号定义的,但您可以使用符号来访问它们。

It's a fairly trivial example. The larger point is that symbols can be used to refer to constants, methods, and instance variables, if for some reason you don't want to refer to them directly via their identifiers. I see this most often used in metaprogramming.

于 2009-03-18T21:17:37.840 回答
0

是的,这些查找各种标识符的值。

我不确定您到底要做什么,但是如果您需要将符号 (:DEFAULT) 转换为字符串 ("DEFAULT"),请使用 to_s (:DEFAULT.to__s)。如果您想查找所有可能的标识符,则取决于您要查找的内容。

myobject.methods  # show a list of instance methods an object has (like "say" above)
myobject.instance_variables  # show a list of instance variables an object has (like "@message" above)
myobject.class.constants  # show a list of class level constants (like "DEFAULT" above)

在调试或尝试新的 API 时,我从这些方法中获得了最大的收益。我可能在生产代码中使用这些的唯一原因是输出对象的某种自动字符串表示(XML、HTML、CSV)。

于 2009-03-18T21:12:18.667 回答