1

確率を表現できるクラスが必要です。これは 0 から 1 の間の float のように表すことができ、0.5 未満のものは false と評価されます。(または、1 から -1 の間で、負の値は false です)

p = A.probability() 
puts p # will output 0.3
if(p)
  puts 'success'
else
  puts 'failure'
end
# will outputs 'failure'

この投稿から、それが可能であることを示唆しているようです:すべてのオブジェクトはブール値を持っています... Ruby のほとんどのオブジェクトは真のブール値を持ちます。ブール値が false のオブジェクトは 2 つだけです。どういうわけかこのブール値を設定する必要があるだけです。それで、これは可能ですか?

4

3 に答える 3

5

似たようなことをしたかったのですが、残念ながらRubyではできません。

false のブール値を持つオブジェクトは、falseそれ自体との 2 つだけnilです。数週間前、私は rubinius の主要な開発者の 1 人であるBrixenとインターネット チャット (IRC) で話し合いました。私の理解では、Ruby はオブジェクトが true であるかどうかを判断するとき、オブジェクトのメソッドを呼び出す (つまり、メッセージを送信する) ことはなく、単にオブジェクトへのポインターを調べて、ポインター自体が真であるかどうかを確認します。 false または nil に等しい。オブジェクトのメソッドを呼び出さないため、動作を変更する方法はありません。

あなたができる最善のことは、次のようなものです:

p = A.probability() 
puts p # => 0.3
if p.to_bool
  puts 'success'
else
  puts 'failure'
end
于 2011-11-04T06:32:42.293 に答える
5

デビッドが指摘するように、虚偽は固定的に配線されており、「偽」でないものはすべて真であるため、「ブール値へのキャスト」演算子falsenilありません。ただし、論理否定演算子があるため、ブール値への明示的なキャストを気にしない場合は、それを実行できます。

class P
    attr_accessor :p
    def !@
        p < 0.5
    end
end

その後:

>> p = P.new
>> p.p = 0.75
=> puts 'Pancakes!' if(!!p)
Pancakes!
>> p.p = 0.25
>> puts 'Pancakes!' if(!!p)
# No pancakes for you

すべてのダブルバングは少し醜いかもしれませんが、逆に、少し非標準的なことが起こっていることに人々に気付かせるかもしれません.

于 2011-11-04T06:41:42.087 に答える
1

まず、Floatサブクラスは必要ありません。数値タイプのサブクラス化に関心のある方は、 Katzuda回答をご覧ください。

達成したいことを達成する簡単な方法は、次の方法を使用することです。

class P
  def initialize p; @p = p
    raise "outta range" unless 0 <= @p and @p <= 1 end
  def success?; SUCC <= @p end
  def fail?; not success? end
end

p = P.new 0.3
p.success? # => false
p.fail? # => true

q = P.new 0.7
q.success? # => true
q.fail? # => false

このような状況では、Rubyにメソッドがあることを忘れないでください。

于 2012-03-29T13:08:48.350 に答える