6

我对 Ruby 中的保留字有点困惑。

由 Matz 合着的“The Ruby Programming Language”就是这样说的,begin并且end是该语言的保留字。它们当然在语法上用于标记块。

但是,该语言中的范围对象具有名为beginand的方法end,如

(1..10).end
=> 10 

现在,测试一下,我发现,确实,我可以在对象上定义名为“begin”和“end”的方法,但如果我尝试将变量命名为“begin”,它会失败。(这是使用它作为方法名称的示例,它确实有效...... :)

class Foo
  def begin
    puts "hi"
  end
end

Foo.new.begin

所以,我想我在问,这样的保留字实际上是什么状态?我会想象它们不能用于方法名称(但它似乎有效),或者至少它会是一种糟糕的风格(但它实际上用于 Range 类的核心语言)。

对于何时允许使用它们以及用于什么用途,我感到非常困惑。甚至有这方面的文件吗?

4

2 回答 2

13

是的,它们是保留字。是的,它们可以用于方法名称。不,如果没有明确的接收者,你不能打电话给他们。无论如何,这可能不是一个好主意。

class Foo
  def if(foo)
    puts foo
  end
end

Foo.new.if("foo") # outputs foo, returns nil

更新:这是 Matz(Ruby 的创建者)自己引用的“The Ruby Programming Language”:

在大多数语言中,这些词将被称为“保留词”,它们永远不会被允许作为标识符。Ruby 解析器很灵活,如果您在这些关键字前面加上 @、@@ 或 $ 前缀并将它们用作实例、类或全局变量名,它不会报错。此外,您可以将这些关键字用作方法名称,但需要注意的是,该方法必须始终通过对象显式调用。

于 2012-04-06T17:09:34.293 回答
2

当它们以明确的方法调用形式给出时,您可以使用它们。如果您在它前面有一个句点.begin或在 is 后面有括号begin(),那么它无疑是一个方法调用。当您尝试将其用作变量begin时,它是模棱两可的(原则上)。

实际上,正如 Perry 所指出的那样,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

它没有定义,看起来像方法调用的可能只是一个返回 last-evaluate 的块3。但周围的线条def begin(foo)仍然是个谜。

于 2012-04-06T17:10:48.523 回答