12

これはしばらくの間私を夜更かししてきました。

class Foo
  def bar
    'bar'
  end

  # What the hell is going on here?!?
  alias :baz :bar
end

Foo.new.baz #=> 'bar'

なぜalias2つの記号を引数として取るのに、それらをコンマで区切っていないのですか?これは、他のコンテキストでは有効な構文ではないようです。実際、コンマを使用すると、実際には構文エラーがスローされます。

alias :bar, :baz
# syntax error, unexpected ','

ただし、同じ方法で2つのシンボルを自分のメソッドに渡そうとすると、次のように爆発します。

def somemethod(*args)
  :whatever
end
somemethod :a :b
# syntax error, unexpected ':', expecting $end
  1. では、なぜaliasメソッドは他に何も使用できない構文を使用するのでしょうか。
  2. この構文を他のコンテキストで使用することは可能ですか?
  3. 言語の他の何もこのように機能しないときに、この奇妙な構文の癖を使用することの利点は何ですか?この言語の不一致による認識できるメリットは見当たりません。
4

2 に答える 2

18

動作する理由は、、などaliasに似たRubyキーワードであるためです。これはメソッドではありません。classdef

Rubyのalias設計者はコンマを必要としないと判断したため、キーワードにコンマは必要ありません。キーワードは基本的にインタプリタでハードコーディングされています。

aliasエイリアスが実行時ではなく解析時に発生することを確認する必要がある場合には、十分な理由があります。

aliasキーワードは紛らわしいまたは意外かもしれません。Module#alias_method通常の開発では、コンマを使用して実行時に機能するRubyメソッドを使用する方が良いと思います。

とについての良いブログ投稿aliasがありalias_methodます:

これは、aliasがキーワードであり、字句スコープであるためです。これは、ソースコードが読み取られたときのself値として扱われることを意味します。self対照的に、実行時に決定された値としてalias_method扱われます。self

全体的に、私の推奨事項はを使用することalias_methodです。alias_methodはクラスで定義されたメソッドであるため 、Module後でオーバーライドでき、柔軟性が向上します。

于 2012-11-22T00:30:14.737 に答える
7

それはメソッドではなく、それらは引数ではありません。aliasRubyの数少ないキーワードの1つです(ここですべてを参照してください!)。それも私を悩ませているので、私はに切り替えましたalias_method(そしてこれには他の議論があります)。

于 2012-11-22T00:31:11.507 に答える