【问题标题】:A float subclass that can be evaluated to false (fuzzy logic) in Ruby在 Ruby 中可以评估为 false(模糊逻辑)的浮点子类
【发布时间】:2011-11-04 06:20:04
【问题描述】:

我需要一个可以表示概率的类。它可以表示为 0 和 1 之间的浮点数,低于 0.5 的任何值都应评估为 false。 (或者它可以在 1 和 -1 之间,任何负数都是假的)

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

post 看来,这是可能的:每个对象都有一个布尔值...... Ruby 中的大多数对象都将有一个布尔值 true。只有两个对象的布尔值为 false。 只是我需要以某种方式设置这个布尔值。那么这可能吗?

【问题讨论】:

    标签: ruby boolean fuzzy-logic


    【解决方案1】:

    我想做类似的事情,但不幸的是,这在 Ruby 中是不可能的。

    布尔值为 false 的唯一两个对象是 false 本身和 nil。几周前,我与 rubinius 的主要开发人员之一Brixen 进行了一次互联网聊天 (IRC) 讨论,他解释得很好。我的理解是,当 Ruby 决定一个对象是否为真时,它不会调用该对象的任何方法(即向该对象发送任何消息),它只是查看它拥有的指向该对象的指针以查看指针本身是否为等于 false 或 nil。由于它不调用对象上的任何方法,因此您无法更改行为。

    你能做的最好的事情是这样的:

    p = A.probability() 
    puts p # => 0.3
    if p.to_bool
      puts 'success'
    else
      puts 'failure'
    end
    

    【讨论】:

    • 如果您查看源代码,您会发现QfalseQtrueQnil 的硬接线值;在ruby.h 中查找enum ruby_special_consts,你会在下面看到C 枚举和一些#defines。
    【解决方案2】:

    没有“转换为布尔值”运算符,因为正如 David 指出的那样,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
    

    所有的双刘海都可能有点难看,但从好的方面来说,它可能会让人们注意到正在发生一些不标准的事情。

    【讨论】:

    • @lulalala:我认为一种独特的方法更具前瞻性,很有可能有人会在未来看到双刘海并在不知道运算符过载的情况下将其取出。
    【解决方案3】:

    首先,您不需要 Float 子类。有兴趣继承 Numeric 类型的可以查看Katzudaanswer

    实现你想要实现的简单方法就是简单地使用一个方法:

    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-01-18
      • 2013-03-23
      • 1970-01-01
      • 2021-03-05
      • 2019-04-27
      • 2015-03-15
      • 2014-01-19
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多