加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 一元运算符的行为

发布时间:2020-12-17 03:32:06 所属栏目:百科 来源:网络整理
导读:在Fixnum类中重新定义 Ruby中的一元运算符时有一些奇怪的结果.不完全确定事情发生的原因(特别是第009行). irb:003 class Fixnumirb:004 def +@ #define unary +irb:005 15irb:006 endirb:007 end= nilirb:008 2= 2irb:009 +2= 2irb:010 +(2)= 15irb:011 ++2=
在Fixnum类中重新定义 Ruby中的一元运算符时有一些奇怪的结果.不完全确定事情发生的原因(特别是第009行).

irb:003> class Fixnum
irb:004>   def +@ #define unary +
irb:005>     15
irb:006>   end
irb:007> end
=> nil
irb:008> 2
=> 2
irb:009> +2
=> 2
irb:010> +(2)
=> 15
irb:011> ++2
=> 15

解决方法

我怀疑你看到解析器行为在解释数字文字方面的副作用.

如果我们创建自己的类:

class C
  def +@
    11
  end
end

然后看一些事情:

> c = C.new
> +c
 => 11 
> ++c
 => 11

这正是我们期望发生的事情.如果我们使用Fixnum一元覆盖和Fixnum变量:

> n = 23
> +n
 => 15 
> ++n
 => 15

然后我们再次看到你所期待的.在这两种情况下,我们都看到在非文字上调用@方法的结果.

但是,当我们与您的操作符一起考虑6时:

> +6
 => 6

@方法未被调用.同样,如果我们覆盖 – @:

class Fixnum
  def -@
    'pancakes'
  end
end

看看它做了什么:

> -42
 => 42

那么这里发生了什么?好吧,Ruby看到6和-42不是6.send(:@)和42.send(: – @)方法调用,而是作为正六和负四十二的单个文字.

如果你开始添加括号,(6)和 – (42),那么Ruby会看到非文字表达式并最终调用一元方法.同样当你将一元运算符加倍时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读