La risoluzione costante richiede sempre l'utilizzo di ::
.
L'invocazione del metodo è idiomatica e di solito un periodo (.
), ma anche ::
è legale. Questo non è solo vero per i cosiddetti metodi di modulo, ma per invocare un metodo su un oggetto qualsiasi:
class Foo
def bar
puts "hi"
end
end
Foo.new::bar
#=> hi
Non è tanto "zucchero sintassi" in quanto è la sintassi semplice alternativa, come ad esempio la capacità di scrivere if
oppure case
dichiarazioni con una nuova riga, then
e newline o solo then
.
È specificamente consentito perché rubino permette metodi con lo stesso nome di una costante, ed a volte ha senso pensare che siano la stessa voce:
class Foo
class Bar
attr_accessor :x
def initialize(x)
self.x = x
end
end
def self.Bar(size)
Foo::Bar.new(size)
end
end
p Foo::Bar #=> Foo::Bar (the class)
p Foo::Bar(42) #=> #<Foo::Bar:0x2d54fc0 @x=42> (instance result from method call)
Vedete questo comunemente in Ruby nel Nokogiri libreria, che ha (ad esempio) il modulo Nokogiri::XML
e il metodo Nokogiri.XML
. Quando si crea un documento XML, molte persone scelgono di scrivere
@doc = Nokogiri::XML(my_xml)
Si vede anche questo nella biblioteca Sequel, dove è possibile scrivere sia:
class User < Sequel::Model # Simple class inheritance
class User < Sequel::Model(DB[:regular_users]) # Set which table to use
Anche in questo caso, abbiamo una method (Sequel.Model) chiamato lo stesso a constant (Sequel::Model). La seconda riga potrebbe anche essere scritta come
class User < Sequel.Model(DB[:regular_users])
e hellip, ma non sembra altrettanto bello.
Non sei confuso: entrambi sono legali. Vedi la mia risposta estesa sotto per il perché. – Phrogz