По соглашению, заглавные буквы начинаются с константы . Когда вы вызываете SayHi
, вы говорите Ruby искать константу с этим именем . Конечно, его нет, поэтому он терпит неудачу.
Если вы хотите вызвать метод, вам нужно добавить пару скобок. Например,
def S
puts "shazam!"
end
S #=> NameError: uninitialized constant S
S() #=> "shazam!"
Внутри класса правила разрешения немного отличаются. Давайте определим простой класс с константой и именем метода, который будет выглядеть как константа:
irb(main):001:0> class C
irb(main):002:1> A = "x"
irb(main):003:1> def B
irb(main):004:2> puts "B() invoked"
irb(main):005:2> end
irb(main):006:1> end
=> nil
Теперь A
, безусловно, является константой. Но как насчет B
?
irb(main):008:0> C.const_defined?("A")
=> true # A is a constant!
irb(main):009:0> C.const_defined?("B")
=> false # B looks like a constant but isn't, because we
# used "def" to create it. "def" is for methods,
# not constants.
Так что это не константа, это просто метод с таким именем. Когда мы пытаемся получить доступ к B
из экземпляра C
, теперь Ruby ищет метод:
irb(main):011:0> C.new.B
B() invoked
=> nil
Если мы хотим получить доступ к константе C
, мы используем квалификатор области ::
:
irb(main):012:0> C::A
=> "x"