【问题标题】:Define custom Ruby operator定义自定义 Ruby 运算符
【发布时间】:2012-08-06 03:46:01
【问题描述】:

问题是:我可以在 Ruby 中定义我的 自己的自定义 运算符,除了 “Operator Expressions”?

例如:1 %! 2

【问题讨论】:

  • 我只是在学习,还没试过。但我读过here 我无法定义这样的方法。可以举个例子吗?
  • Here 是一篇讨论这个话题的不错的文章。
  • 感谢您的文章,但这不是我要问的。
  • This 让你可以使用一些重载技巧来实现a |op| b

标签: ruby operators metaprogramming


【解决方案1】:

没有。您只能定义已在 ruby​​、+、-、!、/、% 等中指定的运算符(您看到了列表)

你自己看看这行不通

def HI
  def %!
    puts "wow"
  end
end

这主要是由于语法解析器必须扩展以接受使用 new 运算符的任何代码。


正如 Darshan 提到的,仅此示例可能不足以解决根本问题。相反,让我们仔细看看解析器如何使用此运算符处理一些示例代码。

3 %! 0

虽然我的间距看起来很明显,这应该是 3.%!(0) 没有间距它变得更难看到。

3%! 也可以看作3.%(0.!) 解析器不知道该选择哪个。目前,没有简单的方法来告诉它。相反,我们可能希望覆盖 3.%(0.!) 的含义,但这并不完全是定义一个新的运算符,因为我们仍然仅限于 ruby​​ 的可解析符号

【讨论】:

  • 感谢您的回复。那么,我有能力覆盖内置运算符,但不能创建自己的运算符,这不合逻辑。
  • 不合逻辑?当解析器遇到任何运算符时,它实际上是方法调用的语法糖。因此方法分派规则像往常一样适用。定义内置运算符只是定义您自己的方法来利用这种糖。定义新的运算符需要解析器知道如何解析你的新运算符。例如它对var%! 有什么作用。这是var.send(:%).send(:!) 还是var.send(:%!)。这有意义吗?
  • 但是,我可以像下面这样使用这个运算符吗:var.%!=("one")?
  • 不,% 和 !都是保留的,并且不能是方法名称的一部分(除非它们是已建立的运算符之一)。这也是为了防止无法解析的语法。
  • 每个特殊符号都保留?比如
【解决方案2】:

您可能无法 Ruby 中做到这一点,只能通过修改Ruby 本身。我认为修改 parse.y 将是你最好的选择。 parse.y famtour

【讨论】:

  • 但这会使您的脚本不可读和不可交换
  • @peter 不会“不可读”适用于这个问题的任何答案,除了“不要这样做!”回答?
【解决方案3】:

是的,可以创建自定义运算符,但有一些注意事项。 Ruby 本身并不直接支持它,但superators gem 做了一个巧妙的技巧,它将运算符链接在一起。这允许您创建自己的运算符,但有一些限制:

$ gem install superators19

然后:

require 'superators19'

class Array
  superator "%~" do |operand|
    "#{self} percent-tilde #{operand}"
  end
end

puts [1] %~ [2]
# Outputs: [1] percent-tilde [2]

由于上述限制,我无法执行您的 1 %! 2 示例。 Documentation 包含完整的详细信息,但无法为 Fixnums 指定超级节点,并且 ! 不能在超级节点中。

【讨论】:

  • 这就是我要问的:)
  • 据我所知,superators 的工作方式实际上是将您的自定义运算符作为参数发送给扩展核心运算符作为真正的方法。所以你并没有真正创建一个新的运算符,但它是使用 ruby​​ 核心功能的一种聪明方法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2022-01-14
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多