在Sketchup红宝石中,边缘 Edge 类具有一个名为“ end ”的方法。
Ruby如何处理此方法名称,使其与标记受保护的关键字(例如if … end
)不冲突?
答案 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
class Foo
def end
end
def test
send(:end)
method(:end).call
end
end
您还可以在实例(@end),类(@@ end)和全局($ end)变量名称中使用关键字,因为该标记告诉解析器我们正在处理变量,但不适用于具有没有印记。
答案 1 :(得分:1)
Ruby如何处理此方法名称,使其与受保护的关键字不冲突
简单:它们不是受保护的关键字。它们被记录为关键字,但是实际上,在解析器中,它们并不是真的。它们更像C♯所说的“上下文关键字”,即仅在特定上下文中对其进行特殊处理。