Será que este código Ruby procurar identificadores ou os valores associados com eles?

StackOverflow https://stackoverflow.com/questions/659660

  •  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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top