首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中,如何使用coerce()实现"20点“和”点20“?

在Ruby中,如何使用coerce()实现"20点“和”点20“?
EN

Stack Overflow用户
提问于 2010-05-10 16:19:09
回答 1查看 307关注 0票数 0

在Ruby中,

代码语言:javascript
运行
复制
point - 20     # treating it as point - (20,20)
20 - point     # treating it as (20,20) - point

将会被实施。

但是下面的代码:

代码语言:javascript
运行
复制
class Point

  attr_accessor :x, :y

  def initialize(x,y)
    @x, @y = x, y
  end

  def -(q)
 if (q.is_a? Fixnum)
   return Point.new(@x - q, @y - q)
 end
    Point.new(@x - q.x, @y - q.y)
  end

  def -@
    Point.new(-@x, -@y)
  end

  def *(c)
    Point.new(@x * c, @y * c)
  end

  def coerce(something)
    [self, something]
  end

end

p = Point.new(100,100)
q = Point.new(80,80)

p (-p)

p p - q
p q - p

p p * 3
p 5 * p

p p - 30
p 30 - p

输出:

代码语言:javascript
运行
复制
#<Point:0x2424e54 @x=-100, @y=-100>
#<Point:0x2424dc8 @x=20, @y=20>
#<Point:0x2424d3c @x=-20, @y=-20>
#<Point:0x2424cc4 @x=300, @y=300>
#<Point:0x2424c38 @x=500, @y=500>
#<Point:0x2424bc0 @x=70, @y=70>
#<Point:0x2424b20 @x=70, @y=70>        <--- 30 - p the same as p - 30

30 - p实际上将被强制函数视为p - 30。它能工作吗?

实际上,我很惊讶-方法不会以这种方式强迫参数:

代码语言:javascript
运行
复制
class Fixnum
  def -(something)
    if (/* something is unknown class */)
      a, b = something.coerce(self)
      return -(a - b)   # because we are doing a - b but we wanted b - a, so it is negated
    end
  end
end

也就是说,该函数返回一个negated version of a - b,而不仅仅是返回a - b

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-10 19:52:16

减法不是一个可交换的操作,所以你不能仅仅在你的coerce中交换操作数并期望它工作。coerce(something)应返回[something_equivalent, self]。因此,在您的情况下,我认为您应该这样编写您的Point#coerce

代码语言:javascript
运行
复制
def coerce(something)
  if something.is_a?(Fixnum)
    [Point.new(something, something), self]
  else
    [self, something]
  end
end

您需要稍微更改其他方法,但我将把它留给您。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2801241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档