类如何具有名为end的方法

时间:2019-01-15 14:11:10

标签: ruby

在Sketchup红宝石中,边缘 Edge 类具有一个名为“ end ”的方法。

Ruby如何处理此方法名称,使其与标记受保护的关键字(例如if … end)不冲突?

2 个答案:

答案 0 :(得分:3)

  

Ruby如何处理此方法名称以不与   受保护的关键字标记了阻止结束(例如,如果…结束)?

使用def时,解析器假定后面是一个由括号或空格分隔的标识符(排序的符号)。您无法使用def动态分配方法名称(不使用某种形式的eval)。

define_method(:end){}带有符号(或字符串),因此在此处使用保留字也没有问题。

但是不能使用隐式接收器来调用这些方法,就像在类中通常这样:

# ok
class Foo
  def end
  end

  def test
    # not ambiguous 
    self.end 
  end
end

# syntax error, unexpected keyword_end, expecting end-of-input
class Bar
  def end
  end

  def test
    end 
  end
end

您可以使用明确的接收方来调用该方法:

Foo.new.end

或通过sendcall使用动态调用。

class Foo
  def end
  end

  def test
    send(:end)
    method(:end).call
  end
end

您还可以在实例(@end),类(@@ end)和全局($ end)变量名称中使用关键字,因为该标记告诉解析器我们正在处理变量,但不适用于具有没有印记。

答案 1 :(得分:1)

  

Ruby如何处理此方法名称,使其与受保护的关键字不冲突

简单:它们不是受保护的关键字。它们被记录为关键字,但是实际上,在解析器中,它们并不是真的。它们更像C♯所说的“上下文关键字”,即仅在特定上下文中对其进行特殊处理。