若字面值前面出现符号时,不会进行单项操作符`-', `+'的方法调用。
class Fixnum
def -@
"negative #{self}"
end
end
p -10 # => -10
n = 10
p -n # => "negative 10"
这种差异也会影响到结合度。
p -10.abs # => 10 n = 10 p -n.abs # => -10
在使用alias等来定义实际的数值类的Numeric父类或Integer父类中的方法时,需要特别注意原来那个方法的归属问题。
即使已经在Integer类中使用alias定义过to_s,也不会在Fixnum或Bignum中产生预期的效果。
class Integer alias_method :foo, :to_s alias :bar :to_s def baz; to_s; end end 1.class #=> Fixnum 1.to_s #=> "1" 1.foo #=> "#<Fixnum:0x3>" ... 并不是1.to_s 1.bar #=> "#<Fixnum:0x3>" ... 并不是1.to_s 1.baz #=> "1"
这是因为Fixnum#foo并没有调用(已定义的)Fixnum#to_s,而是调用了(未定义的)Integer#to_s,即Object#to_s所致。
请参考Numeric来了解各个方法的所属类。
对整数(Integer)进行除法`/'运算时,会返回小于原数的一个最大整数(整除)。特别是处理负号时,需要特别留意。
p( 5/2 ) # => 2 p( 1/2 ) # => 0 p( -1/2 ) # => -1 p( -(1/2) ) # => 0 p( (-1)/2 ) # => -1 p( (-1)/(-2) ) # => 0 p( 1/(-2) ) # => -1 p( -(1/(-2)) ) # => 1
若不想要整数,而想得到`正常的'商的话,应该require mathn.rb。