6

Rubyの予約語についてちょっと混乱しています。

Matz が共著した「The Ruby Programming Language」では、beginandendはこの言語の予約語であると述べています。それらは確かに構文的にブロックをマークするために使用されます。

ただし、言語の範囲オブジェクトには、次のようにbeginおよびという名前のメソッドがあります。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あいまいです(原則として)。

実際、ペリーが指摘するように、注意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)は謎のままです。

于 2012-04-06T17:10:48.523 に答える