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会看到非文字表达式并最终调用一元方法.同样当你将一元运算符加倍时. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |