Ruby的NilClass实例中的to_i方法返回零的事实背后的科学是什么?返回无或引发异常不会更符合逻辑?Ruby Nil and Zero
回答
NilClass
定义#to_i
出于同样的原因它定义了一个#to_a
返回[].
它给你正确的类型,但空之类的价值的东西。
这实际上非常有用。例如:
<%= big.long.expr.nil? ? "" : big.long.expr %>
变为:
<%= big.long.expr %>
的效果好很多! (ERB是调用#to_s其中对于零,为 “”)。而且:
if how.now.brown.cow && how.now.brown.cow[0]
how.now.brown.cow[0]
else
0
end
变为:仅需要表示时
how.now.brown.cow.to_a[0].to_i
短转化存在。长时间转换是Ruby核心方法调用的转换,它们需要非常接近的东西。如果您想要进行类型检查,请使用它们。
即:
thing.to_int # only works when almost Integer already. NilClass throws NoMethodError
thing.to_i # this works for anything that cares to define a conversion
*“好多了!”*是的,这取决于你和项目工作的其他人都知道Ruby以及你想要依赖不直观行为的程度。返回0而不是引发异常的'nil.to_i'在逻辑上没有太大的意义。你怎么能从'nil'得到'0'?它不像'nil == 0'返回true,但'to_i'意味着等价。 –
@Ed S .:不,'to_int'意味着等价,'to_i'非常松散,它并不意味着什么。 –
伟大的答案!我总是忽略了长期的转换,现在我可以理解它们以及红宝石哲学中的合适性。 –
它适合放纵的红宝石理念(相对于,例如,Python的严格性):
nil.to_i #=> 0
"".to_i #=> 0
"123hello".to_i #=> 123
"hello".to_i #=> 0
说实话,我认为这是过于宽松。正如Zabba所述,您可以使用Kernel#Integer(string)进行严格转换。
to_i
表示“如果可以的话,将我转换为整数”。
如果你想要“如果你非常像整数,给我你的整数值,否则给一个NoMethodError”,然后使用.to_int
。
还有另外一个问题,询问有关to_i
和to_int
之间的区别,to_s
与to_str
等让我知道,如果你想我帮您找到它。
的to_i
协议说,你必须返回的Integer
,你不能引发异常。你的两条建议至少违反了其中一条规则。所以,不,这些不仅不会更合乎逻辑,而且会变得无效。
但是,请注意,nil
不会回应to_int
。如果它确实对to_int
作出回应,那确实是“不合逻辑的”。
协议说'to_i'必须返回一个整数并不会使这种行为变得合乎逻辑,它只是使其符合规定(假设,即使不合逻辑,也最好符合它)。 –
如果你碰巧在Rails的,那么你可以使用try
:
nil.to_i # => 0
nil.try :to_i # => nil
- 1. false && nil and nil && false in ruby
- 2. C++ Functors and Zero
- 3. NumericTraits Zero and One
- 4. Chef Vault with Test-Kitchen,Vagrant and Chef-Zero provisioner
- 5. Ruby和Nil对象
- 6. webrick and ruby interpreter
- 7. Ruby EventMachine and Multicast
- 8. Ruby and PHP togheter
- 9. ruby and ruby on rails book(2009)
- 10. Ruby on Rails to_xml nil =“True”
- 11. Ruby on Rails 5 and Devise:Overriding after_sign_out_path_for
- 12. Ruby - Threads and Dir [] arrays
- 13. Ruby on Rails:link_to_remote and rel
- 14. ruby on rails and mongo
- 15. true-false或zero-and-ones数组的热图
- 16. ruby数组迭代和检查nil值
- 17. Ruby字符串“nil”为零:NilClass nil(反向的nil.inspect)
- 18. ruby method_missing class and module中的用法
- 19. ruby case case statement and compare
- 20. ruby“each do”and scriptaculous Effect.BlindDown/Up
- 21. ruby on rails,searchlogic and refactoring
- 22. Heroku with ruby on rails and Mongoid
- 23. ruby Class.new在rspec中返回nil
- 24. 为什么Ruby中的a = a`` nil`?
- 25. Ruby on Rails ENV ['RAILS_ENV']返回nil
- 26. Ruby放在救援中显示nil
- 27. 混淆`nil`输出时,在Ruby中
- 28. 在Ruby中,为什么!nil return => true?
- 29. image naturalWidth return zero
- 30. Convert.ToInt32 - Keep Preceding Zero
相关:您可以使用'N =整数(STR)'如果你想提高对故障异常。 – Dogbert