2010-09-05 119 views
4

目的是避免在Ruby中感實性的任何標準的方式,或者我需要推出自己的解決方案,如如何避免Ruby中的錯誤?

class FalseClass 
    def to_bool 
    self 
    end 
end 

class TrueClass 
    def to_bool 
    self 
    end 
end 

true.to_bool # => true 
false.to_bool # => false 
nil.to_bool # => NoMethodError 
42.to_bool # => NoMethodError 

背景:我知道to_bool將違背紅寶石的許可性質,但我玩弄三元邏輯,並希望避免意外做這樣

require "ternary_logic" 
x = UNKNOWN 
do_something if x 

東西我使用三元邏輯,因爲我正在寫一個室友共享網站的解析器(爲個人,而非商業,使用),有些字段可能會變成mi查看信息,因此不知道該地點是否符合我的標準。但是,我試圖限制使用三元邏輯的代碼量。

回答

9

在Ruby中不可能影響真實性或謬誤。 nilfalse都是虛假的,其他的都是真的。

這是一個每兩年出現一次的功能,但總是被拒絕。 (對於我個人沒有找到有說服力的,但我不是一個發號施令的原因。)

您必須實現自己的邏輯系統,但你不能使用Ruby的邏輯運算上的禁止某人未知值。

I re-implemented Ruby's logic system once,爲了好玩,並表明它可以做到。把它擴展到三元邏輯應該相當容易。 (當我寫到這,我居然拿了一致性測試從RubySpec和ported them to my implementation,他們都通過了,所以我相當確信它Ruby的語義匹配。)

+0

我喜歡你的邏輯系統jorgie – horseyguy 2010-09-05 10:59:53

+0

@banister:正如我在寫自述,這不是真的我的。這是布爾人在我出生之前就已經在Smalltalk中實現的原因。 – 2010-09-05 15:49:02

4

可以在1.9乘坐重寫!運營商的優勢以及用於重新定義真實性的成語!!

讓我們Pythonesque感實性:

class Numeric 
    def ! 
    zero? 
    end 
end 

class Array 
    def ! 
    empty? 
    end 
end 

!![] #=> false 
!!0 #=> false 
+2

我冒昧地簡化了你的代碼。 – 2010-09-05 23:06:20

+1

@marc非常感謝,這真是我的蠢話 – horseyguy 2010-09-05 23:42:59

+1

@ Marc-AndréLafortune:我也是:-) – 2010-09-06 00:22:34

1

我也在紅寶石(樂趣)使我自己的邏輯系統,您可以輕鬆地重新定義感實性: 注意,正常條件句類似物是如果!/else_if!/別的!

# redefine truthiness with the `truth_test` method 
CustomBoolean.truth_test = proc { |b| b && b != 0 && b != [] } 

if!(0) { 
    puts 'true' 
}. 
else! { 
    puts 'false' 
} 
#=> false 

見:http://github.com/banister/custom_boolean