Ruby sembra aver subito modifiche diverse volte rispetto all'accessibilità costante. Per Ruby 1.9.2, c'è una descrizione riguardante l'accessibilità costante nella domanda e la risposta here, ma ciò che è scritto non è più vero.Come viene determinata l'accessibilità costante?
In Ruby 2.3, se ho una costante definita in una classe:
class A
Foo = :a
end
Non posso accedere tramite instance_eval
o class_eval
:
A.new.instance_eval{Foo} # => error
A.class_eval{Foo} # => error
A.instance_eval{Foo} # => error
anche se posso accedervi dal corpo della classe :
class A; Foo end # => :a
come funziona l'accessibilità costante di Ruby 2.3? Se possibile, si prega di spiegare i cambiamenti storici di accessibilità costante in Ruby e gli argomenti che li hanno portati.
Inoltre, 'A.const_get: Foo # =>: a' e' A.class_eval "Foo" =>: a' (2.3). –
@CarySwoveland Destra. Ma quelli sono più simili agli usi reali/principali delle varietà eval, che analizzano da una stringa/simbolo. E soprattutto, 'const_get' è progettato proprio per farlo; se non funzionasse in quel modo, sarebbe un grosso problema. – sawa
Vorrei risolvere questo problema con parser parsimonioso, non con una ricerca costante. BTW, 2.1 funziona come 2.3. Ad ogni modo: 'A.instance_eval {| a | a :: Foo} # =>: a' e 'A.instance_eval {self :: Foo} # =>: a', mentre' A.instance_eval {Foo} # => error'. Gli ultimi due devono comportarsi allo stesso modo, è per questo che do la colpa al parser. – mudasobwa