Será que este código Ruby procurar identificadores ou os valores associados com eles?
-
20-08-2019 - |
Pergunta
Eu tenho tentado entender este exemplo código Ruby a partir de um entrada de blog que diz que usa os símbolos: Padrão,: dizer e: @message 'para procurar identificadores'. Mas pelo que eu posso dizer, ele não está olhando para cima os identificadores, mas os valores associados a esses identificadores. Pensei identificadores são nomes de variáveis, métodos, etc. Assim, os identificadores seria " Padrão ", " dizer " e " mensagem "? A saída do programa é abaixo.
Além disso, por que você precisa para procurar um identificador?
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
Quando eu executar o código eu recebo esta saída:
Hello
#<Method: Demo#say>
Hello
Solução
O código de exemplo usa símbolos para chegar a três coisas: o valor da const DEFAULT
(acessado através :DEFAULT
), um objeto método (acessado através :say
), e o valor de uma variável de instância (acessado através :@message
). Nenhum dos três objetos foram definidos usando um símbolo, mas você pode usar símbolos para acessá-los.
É um exemplo bastante trivial. O maior ponto é que símbolos podem ser usados ??para se referir a constantes, métodos e variáveis ??de instância, se por algum motivo você não quer se referir a eles diretamente através de seus identificadores. Eu vejo isso mais frequentemente usado em metaprogramming.
Outras dicas
Sim, estes olhar para cima os valores de vários identificadores.
Eu não sei exatamente o que você está tentando fazer, mas se você precisa traduzir um símbolo (: padrão) para uma string ( "DEFAULT") to_s uso (: DEFAULT.to__s). Se você quiser procurar todas as possíveis identificadores que iria depender do que você está procurando.
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)
Eu recebo o mais milhagem fora desses métodos quando a depuração ou experimentar novas APIs. A única razão pela qual eu provavelmente usá-los no código de produção é a saída de algum tipo de representação automática string (XML, HTML, CSV) de um objeto.