是否“开始”和“结束”保留字?

时间:2012-04-06 17:07:23

标签: ruby

我对Ruby中的保留字感到困惑。

"由Matz共同撰写的Ruby编程语言"表示beginend是该语言的保留字。他们肯定会在语法上用来标记块。

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

(1..10).end
=> 10 

现在,测试一下,我发现,确实,我可以定义名为" begin"和"结束"但是如果我试图命名一个变量"开始"它失败。 (这里有一个使用它作为方法名称的样本,它实际上有效......:)

class Foo
  def begin
    puts "hi"
  end
end

Foo.new.begin

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

我很困惑他们什么时候被允许使用以及什么时候被使用。甚至有关于此的文件吗?

2 个答案:

答案 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)周围的线条仍然很神秘。