Этот код Ruby ищет идентификаторы или значения, связанные с ними? - PullRequest
1 голос
/ 18 марта 2009

Я пытался понять этот пример кода 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

Ответы [ 2 ]

2 голосов
/ 19 марта 2009

В примере кода используются символы, чтобы получить три вещи: значение DEFAULT const (доступ через :DEFAULT), объект метода (доступ через :say) и значение переменной экземпляра (доступ через :@message). Ни один из трех объектов не был определен с использованием символа, но вы можете использовать символы для доступа к ним.

Это довольно тривиальный пример. Более важно то, что символы могут использоваться для ссылки на константы, методы и переменные экземпляра, если по какой-то причине вы не хотите ссылаться на них напрямую через их идентификаторы. Я вижу это чаще всего используется в метапрограммировании.

0 голосов
/ 19 марта 2009

Да, они ищут значения различных идентификаторов.

Я не уверен, что именно вы пытаетесь сделать, но если вам нужно перевести символ (: 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) объекта.

...