4

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それはRubyの寛容な性質に反することはわかっていますが、私は3値論理で遊んでおり、誤って次のようなことをしないようにしたいと考えています。

require "ternary_logic"
x = UNKNOWN
do_something if x

私はフラットメイト共有Webサイトのパーサーを書いているので(個人用、商用ではなく)、一部のフィールドで情報が欠落している可能性があるため、3値論理を使用しています。したがって、場所が不明である可能性があります。私の基準を満たしているかどうか。ただし、3値論理を使用するコードの量を制限しようと思います。

4

3 に答える 3

9

Ruby では真偽に影響を与えることはできません。nilfalseは偽りで、それ以外はすべて真実です。

これは、数年ごとに登場する機能ですが、常に拒否されます。(個人的には説得力がないと思う理由からですが、私が決定権を持っているわけではありません。)

独自の論理システムを実装する必要がありますが、未知の値に対して Ruby の論理演算子を使用することを禁止することはできません。

Ruby のロジック システムを 1 回再実装しましたが、これは楽しみのためであり、実行可能であることを示すためでもあります。これを三値論理に拡張するのはかなり簡単です。(私がこれを書いたとき、私は実際に RubySpec から適合性テストを取得し、それらを自分の実装に移植しました。それらはすべて合格したので、Ruby のセマンティクスと一致していると確信しています。)

于 2010-09-05T10:31:33.127 に答える
4

!1.9のオーバーライド可能な演算子と!!イディオムを利用して、真実性を再定義できます。

Pythonesque の真実性を考えてみましょう:

class Numeric
  def !
    zero?
  end
end

class Array
  def !
    empty?
  end
end

!![] #=> false
!!0 #=> false
于 2010-09-05T11:24:20.993 に答える
1

また、Rubyで独自のロジックシステムを作成しました(楽しみのために)。真実性を簡単に再定義できます。通常の条件の類似物はif!/ else_if!/ else!であることに注意してください。

# 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

于 2010-09-22T07:39:47.540 に答える