Постоянное разрешение всегда требует использования ::
.
Метод вызова идиоматически и обычно период (.
), но ::
также является законным. Это не только верно для так называемых методов модуля, но для вызова любого метода любого объекта:
class Foo
def bar
puts "hi"
end
end
Foo.new::bar
#=> hi
Это не так много «синтаксиса», как это просто альтернативный синтаксис, таких как умение писать if
или case
с помощью новой строки, then
и новой строки, или только then
.
Это специально допускается, так как рубин позволяет методы с тем же именем, как постоянная, а иногда имеет смысл думать, что они такие же пункт:
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)
Вы видите это обычно в Рубине в Nokogiri библиотека, которая имеет (например) модуль Nokogiri::XML
, а также метод Nokogiri.XML
. При создании документа XML, многие люди предпочитают писать
@doc = Nokogiri::XML(my_xml)
Вы видите это также в Sequel библиотеке, где вы можете написать либо:
class User < Sequel::Model # Simple class inheritance
class User < Sequel::Model(DB[:regular_users]) # Set which table to use
Опять же, у нас есть method (Sequel.Model) названный так же, как a constant (Sequel::Model). Вторая строка также может быть записана как
class User < Sequel.Model(DB[:regular_users])
& hellip; но это выглядит не так хорошо.
Вы не смущены: оба являются законными. См. Мой расширенный ответ ниже, почему. – Phrogz