16
A
回答
20
的双重否定确保无论初始值,你总是会得到true
或false
,从来一些神秘感值。
这很方便,因为它避免了对不再需要的对象的悬挂引用,或者需要区分两种类型的假值nil
和false
。
你经常会看到这样写的方法:
def logged_in?
[email protected]_user
end
这将返回true
或false
,可用于要求不管出于何种目的该值。相比之下,与此:
def logged_in?
@session_user
end
在这种情况下,如果你保存的价值,你实际上是节省了整个@session_user
对象,这可能是内存相当显著块。只有在您引用该内存超出范围之前,才能释放该内存。由于只有一个true
和一个false
,因此不需要垃圾收集。
3
假设您想定义一个返回布尔值的方法。例如,一个字符串是否与正则表达式匹配。
class String
def include? regex; self =~ regex end
end
如果你做到上面,它会返回nil
当它不匹配,和一个整数它匹配时。在许多情况下,这并不重要(nil
类似于false
,而true
可以替代整数)。但是,如果你真的想要一个布尔值作为返回值,如果你这样做
class String
def include? regex; !!(self =~ regex) end
end
它将返回true
它匹配时,false
当它没有。
1
在我看来,Ruby对布尔人来说太聪明了。这是巧妙导致问题的情况的解决方法。
这是过度的聪明:没有布尔类。相反,有一个约定,任何值都可以用作布尔值。在需要真值或假值的情况下,nil
或false
表示“假”,而其他任何表示“真”。值true
和false
不是特殊类的一部分,它们是它们各自类—的唯一成员,它们仅用于使代码更具可读性。
我想这工作得很好大部分的时间,但在每一个曾经很长一段时间,你需要一个布尔值,总是true
或false
。例如,我最近需要比较两个布尔值,如果它们不同,则做一些特殊的事情;唯一的问题是,其中一个是true
或false
,而另一个是1或nil
。固定?利用!!nil == false
和!!1 == true
的事实。
相关问题
- 1. 如何证明类型级布尔的双重否定?
- 2. Ruby:布尔属性命名约定和使用
- 3. 是否有兴趣使用双布尔否定?
- 4. 布尔属性的命名约定
- 5. Python布尔方法命名约定
- 6. 如何为布尔型,POJO和双重改型定义mediatype?
- 7. 双重否定sql查询
- 8. Ruby命名约定?
- 9. Ruby程序约定
- 10. 否定基础上的布尔另一个布尔
- 11. 布尔,英语否定只是摆脱布尔
- 12. 是否定义了负值布尔值?
- 13. 否定Django模板中的布尔值
- 14. 哈斯克尔函数定义约定
- 15. 双重定向
- 16. Ruby on Rails ActiveRecord约定
- 17. Ruby宝石命名约定
- 18. Ruby/Rails命名约定
- 19. MVVMCross布尔绑定
- 20. WPF双重约束
- 21. C++代码中的双重否定
- 22. 什么双重否定用C
- 23. 双重否定对证不是NULL
- 24. agda中的双重否定插入
- 25. Javascript - 为什么使用双重否定
- 26. 嵌套查询和双重否定
- 27. 不存在SQL双重否定
- 28. 使用双重否定 - 为什么?
- 29. 遵循Ruby属性命名约定的C#JSON.NET约定?
- 30. Racket布尔参数的正确命名约定是什么?
不是一个rubyist,但我会想要强制布尔值? – Ethan 2011-04-26 21:49:19
密切相关:http://stackoverflow.com/questions/524658/what-does-mean-in-ruby – 2011-04-26 22:36:19