首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用""*Point时为什么不触发强制

当我使用""*Point时为什么不触发强制
EN

Stack Overflow用户
提问于 2019-05-13 15:01:40
回答 1查看 65关注 0票数 0

我正在尝试弄清楚coerce方法。当我定义*方法和coerce方法时。integer * Point触发coerce,但"" * Point不触发。为什么?

错误是:

代码语言:javascript
运行
复制
coerce.rb:34:in `*': no implicit conversion of Point into Integer (TypeError)   from coerce.rb:34:in `<main>'

代码是:

代码语言:javascript
运行
复制
class Point
  def initialize x,y
    @x,@y = x,y
  end

  def * x
    p "* called" 
    @x *= x
    @y *= x
  end

  def coerce other
    p 'coerce called'

    if other.is_a? String
      p "converted"
      [self, other.to_i]
    else
      [self,other]
    end
    #[3,other]
  end
end

p1= Point.new 1,1
p1*2
p p1
2*p1
p p1

p p1.coerce(2)

p "string test====="
"2" * p1

输出:

代码语言:javascript
运行
复制
"* called"
#<Point:0x00564f5de89dd0 @x=2, @y=2>
"coerce called"
"* called"
#<Point:0x00564f5de89dd0 @x=4, @y=4>
"coerce called"
[#<Point:0x00564f5de89dd0 @x=4, @y=4>, 2]
"string test====="
coerce.rb:34:in `*': no implicit conversion of Point into Integer (TypeError)
    from coerce.rb:34:in `<main>'

谁能告诉我为什么和如何让"2" * p1工作?

EN

回答 1

Stack Overflow用户

发布于 2019-05-14 00:08:12

这里的问题是,虽然Ruby允许您为此重新定义运算符,但这些运算符在排序方面非常特殊。

记住这段代码:

代码语言:javascript
运行
复制
point * 2

最终被Ruby理解为:

代码语言:javascript
运行
复制
point.send(:*, 2)

它是您定义的处理这种特殊情况的方法,Point#*

而这段代码:

代码语言:javascript
运行
复制
2 * point

最终被理解为:

代码语言:javascript
运行
复制
2.send(:*, point)

它会转移到Integer#*,而你无法控制它。虽然你可以修补它,但这似乎是一个非常糟糕的想法。最好的方法是记录你的系统是如何工作的,并展示正确排序的例子。

在Ruby中,二元运算符中的左手边值基本上是发号施令的,右手边的值只是一个乘客。

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

https://stackoverflow.com/questions/56107203

复制
相关文章

相似问题

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