我对Ruby中的保留字感到困惑。
"由Matz共同撰写的Ruby编程语言"表示begin
和end
是该语言的保留字。他们肯定会在语法上用来标记块。
但是,该语言中的范围对象具有名为begin
和end
的方法,如
(1..10).end
=> 10
现在,测试一下,我发现,确实,我可以定义名为" begin"和"结束"但是如果我试图命名一个变量"开始"它失败。 (这里有一个使用它作为方法名称的样本,它实际上有效......:)
class Foo
def begin
puts "hi"
end
end
Foo.new.begin
所以,我想我问,这样的保留字的实际状态是什么?我会想象它们不能用于方法名称(但它似乎工作)或者至少它会是一种糟糕的风格(但实际上它用在Range类的核心语言中)
我很困惑他们什么时候被允许使用以及什么时候被使用。甚至有关于此的文件吗?
答案 0 :(得分:12)
是的,它们是保留字。是的,它们可用于方法名称。不,没有明确的接收者,你不能打电话给他们。无论如何,这可能不是一个好主意。
class Foo
def if(foo)
puts foo
end
end
Foo.new.if("foo") # outputs foo, returns nil
更新:以下是来自Matz(Ruby的创建者)本人的“Ruby编程语言”的引用:
在大多数语言中,这些词会被称为“保留词”和 他们永远不会被允许作为标识符。 Ruby解析器是 灵活,如果你在这些关键字前加上@,则不会抱怨, @@或$前缀,并将它们用作实例,类或全局变量 名。此外,您可以使用这些关键字作为方法名称 请注意,必须始终通过a显式调用该方法 对象
答案 1 :(得分:2)
当它们以明确的方法调用的形式给出时,您可以使用它们。如果您前面有句点.begin
或者在begin()
之后有括号,那么它就是一个方法调用。当您尝试将其用作变量begin
时,它是不明确的(原则上)。
实际上,正如佩里所说,begin()
可能很棘手。我用Ruby 1.9.3检查了irb,发生了以下奇怪的事情:
irb(main):001:0> def begin(foo)
irb(main):002:1> puts 'a'
irb(main):003:1> end
=> nil
irb(main):004:0> begin(3)
irb(main):005:1>
irb(main):006:1* end
=> 3
它没有被定义,看起来像方法调用可能只是一个块返回最后评估的3
。但def begin(foo)
周围的线条仍然很神秘。