如何允许Ruby别名的语法?

Ale*_*yne 12 ruby

这个让我在晚上待了一会儿.

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)
  1. 那么为什么该alias方法可以使用其他任何东西都不能使用的语法?
  2. 是否可以在任何其他上下文中使用此语法?
  3. 使用这种奇怪的语法怪癖有什么好处,当语言中的其他内容没有这种方式工作时?我认为这种语言不一致没有明显的好处.

joe*_*son 18

之所以alias工作是因为它是一个Ruby的关键字,类似class,def等这不是一个方法.

alias关键字不需要逗号,因为Ruby设计者认为它没有.关键字在解释器中基本上是硬编码的.

alias当你需要确定别名发生在分析时而非运行时时,有一个很好的理由.

alias关键字可能令人困惑或令人惊讶.对于典型的开发,我认为最好使用Ruby方法Module#alias_method,它使用逗号并在运行时工作.

这是一篇关于alias的好文章alias_method:

这是因为它alias是一个关键字,它是词法范围的.这意味着它把self作为的值self的源代码被读取的时间.相反,alias_method将其self视为在运行时确定的值.

总的来说,我的建议是使用alias_method.由于 alias_method是在类中定义的方法,Module因此可以在以后重写它,并提供更大的灵活性.


Zac*_*emp 7

这不是一种方法,而不是论据.alias是Ruby中为数不多的关键词之一(在这里看到它们!).它也困扰我,所以我切换到alias_method(还有其他论据).