我是一个 Ruby 初学者。从书中,我知道 Ruby 方法名称应该以小写字母或下划线开头。但我发现了不同的场景:
-
如果一个方法在类外部定义,它只能以小写字母开头,如果你尝试定义一个以大写字母开头的方法,Ruby 会报错,例如:
define sayHi
puts "Hello"
end
sayHi # => Hello
但是,以下代码不起作用:
define SayHi
puts "Hello"
end
SayHi
它会产生一个错误:
:in `<main>': uninitialized constant SayHi (NameError)
-
如果一个方法是在类中定义的,那么它可以以大写字母开头:
class Test
def SayHi
puts "hello"
end
end
t = Test.new
t.SayHi # => hello
有谁知道为什么#1 不起作用而#2 起作用? ruby 方法名称的具体规则是什么?
按照惯例,以大写字母开头的内容是常量。当你调用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
Now, 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"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)