这个让我在晚上待了一会儿.
class Foo
def bar
'bar'
end
# What the hell is going on here?!?
alias :baz :bar
end
Foo.new.baz #=> 'bar'
Run Code Online (Sandbox Code Playgroud)
为什么alias将2个符号作为参数,但没有用逗号分隔它们?在任何其他上下文中,这似乎不是任何形式的有效语法.事实上,如果你使用逗号,它实际上会抛出语法错误.
alias :bar, :baz
# syntax error, unexpected ','
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试以相同的方式将2个符号传递给我自己的方法,它也会爆炸:
def somemethod(*args)
:whatever
end
somemethod :a :b
# syntax error, unexpected ':', expecting $end
Run Code Online (Sandbox Code Playgroud)
alias方法可以使用其他任何东西都不能使用的语法?joe*_*son 18
之所以alias工作是因为它是一个Ruby的关键字,类似class,def等这不是一个方法.
该alias关键字不需要逗号,因为Ruby设计者认为它没有.关键字在解释器中基本上是硬编码的.
alias当你需要确定别名发生在分析时而非运行时时,有一个很好的理由.
该alias关键字可能令人困惑或令人惊讶.对于典型的开发,我认为最好使用Ruby方法Module#alias_method,它使用逗号并在运行时工作.
这是因为它
alias是一个关键字,它是词法范围的.这意味着它把self作为的值self的源代码被读取的时间.相反,alias_method将其self视为在运行时确定的值.总的来说,我的建议是使用
alias_method.由于alias_method是在类中定义的方法,Module因此可以在以后重写它,并提供更大的灵活性.