Ski*_*ick 28 ruby type-conversion
说我有以下代码:
x = 0.8
y = 1.0
Run Code Online (Sandbox Code Playgroud)
什么是最好的检查方式y相当于Integer?目前我正在做:
y.to_int == y
Run Code Online (Sandbox Code Playgroud)
哪个有效,但我觉得应该有一个更好的方法.
通常,==当您不关心数字类型时,应该使用比较数字,这应该是大部分时间。当你真的关心类型时,你应该使用继承自Numeric#eql? .
您可以只询问数字对象是否为整数。例如,数字#整数?让您要求一个数字检查自身并返回一个布尔值:
[1, 1.2, 1.02e+1].map(&:integer?)
#=> [true, false, false]
Run Code Online (Sandbox Code Playgroud)
如果您关心的只是找出y是否是整数,那么这就是要走的路。使用您自己的示例:
y = 1
y.integer?
#=> true
y = 1.0
y.integer?
#=> false
Run Code Online (Sandbox Code Playgroud)
如果您正在尝试做一些更复杂的事情,例如在等式比较中尝试避免自动数字类型转换,唯一真正的限制是您的想象力和您试图在代码中清楚表达的想法。Numeric、Float、Integer、Object、String 和其他类中有许多方法可以让您执行类型转换和严格相等比较。下面是几个例子。
使用各种方法转换为整数,然后检查严格的对象相等性:
y = 1.2
# All of these will return false.
y.eql? y.truncate
y.eql? y.floor
y.eql? y.to_i
y.eql? Integer(y)
Run Code Online (Sandbox Code Playgroud)
如果您想创建一个没有由 进行的自动数字转换的布尔表达式==,您可以使用从Numeric#zero?继承的特定于类的方法。. 例如:
(y % 1).zero?
y.modulo(1).zero?
Run Code Online (Sandbox Code Playgroud)
如果 modulo 不能为您解决某些类型的数字,那么您可以使用Float#ceil或Float#floor:
y = 1.2
(y - y.floor).zero?
#=> false
y = 1.02e+1
(y.floor - y).zero?
#=> false
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12245 次 |
| 最近记录: |