JKi*_*ian 5 ruby operator-overloading operators
当在类中重新定义+
Ruby中的一元运算符时,会产生一些奇怪的结果Fixnum
.不确定为什么事情发生的方式(特别是线路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
Run Code Online (Sandbox Code Playgroud)
我怀疑你看到解析器行为在解释数字文字方面的副作用.
如果我们创建自己的类:
class C
def +@
11
end
end
Run Code Online (Sandbox Code Playgroud)
然后看一些事情:
> c = C.new
> +c
=> 11
> ++c
=> 11
Run Code Online (Sandbox Code Playgroud)
这正是我们期望发生的事情.如果我们使用你的Fixnum
一元+
覆盖和一个Fixnum
变量:
> n = 23
> +n
=> 15
> ++n
=> 15
Run Code Online (Sandbox Code Playgroud)
然后我们再次看到你所期待的.在这两种情况下,我们都会看到在+@
非文字上调用方法的结果.
但是,当我们+6
与您的运营商联系时:
> +6
=> 6
Run Code Online (Sandbox Code Playgroud)
该+@
方法未被调用.同样,如果我们覆盖-@
:
class Fixnum
def -@
'pancakes'
end
end
Run Code Online (Sandbox Code Playgroud)
看看它做了什么:
> -42
=> 42
Run Code Online (Sandbox Code Playgroud)
那么这里发生了什么?那么,红宝石是看到+6
并-42
没有6.send(:+@)
和42.send(:-@)
方法调用,但作为单一文字正六负42.
如果你开始添加括号,+(6)
并且-(42)
,然后红宝石看到非文字表达和结束调用一元的方法.同样当你将一元运算符加倍时.
归档时间: |
|
查看次数: |
166 次 |
最近记录: |