在Ruby中可以计算为false(模糊逻辑)的浮点子类
我需要一个可以表示概率的类。它可以表示为介于0和1之间的浮点,低于0.5的任何值都应计算为false。(也可以介于1和-1之间,任何负值都是假的)在Ruby中可以计算为false(模糊逻辑)的浮点子类,ruby,boolean,fuzzy-logic,Ruby,Boolean,Fuzzy Logic,我需要一个可以表示概率的类。它可以表示为介于0和1之间的浮点,低于0.5的任何值都应计算为false。(也可以介于1和-1之间,任何负值都是假的) 从这一点看来,它似乎表明这是可能的:每个对象都有一个布尔值。。。Ruby中的大多数对象的布尔值都是true。只有两个对象的布尔值为false。只是我需要以某种方式设置这个布尔值。那么这可能吗?我想做类似的事情,但不幸的是,在Ruby中这是不可能的 布尔值为false的仅有两个对象是false本身和nil。几周前,我与rubinius的主要开发者之一进
从这一点看来,它似乎表明这是可能的:每个对象都有一个布尔值。。。Ruby中的大多数对象的布尔值都是true。只有两个对象的布尔值为false。只是我需要以某种方式设置这个布尔值。那么这可能吗?我想做类似的事情,但不幸的是,在Ruby中这是不可能的 布尔值为false的仅有两个对象是
false
本身和nil
。几周前,我与rubinius的主要开发者之一进行了一次网络聊天(IRC)讨论,他解释得很好。我的理解是,当Ruby决定一个对象是否为真时,它不会调用该对象上的任何方法(即向该对象发送任何消息),它只是查看指向该对象的指针,看看指针本身是否等于false或nil。因为它不调用对象上的任何方法,所以您无法更改行为
您所能做的最好的事情如下:
p = A.probability()
puts p # => 0.3
if p.to_bool
puts 'success'
else
puts 'failure'
end
我想做一些类似的事情,但不幸的是,这在Ruby中是不可能的 布尔值为false的仅有两个对象是
false
本身和nil
。几周前,我与rubinius的主要开发者之一进行了一次网络聊天(IRC)讨论,他解释得很好。我的理解是,当Ruby决定一个对象是否为真时,它不会调用该对象上的任何方法(即向该对象发送任何消息),它只是查看指向该对象的指针,看看指针本身是否等于false或nil。因为它不调用对象上的任何方法,所以您无法更改行为
您所能做的最好的事情如下:
p = A.probability()
puts p # => 0.3
if p.to_bool
puts 'success'
else
puts 'failure'
end
没有“cast to boolean”操作符,因为正如David所指出的,falsiness是硬连接的false
和nil
,任何不是“falsy”的都是真的。但是,有一个逻辑求反运算符,如果您不介意显式转换为布尔值,则可以执行此操作:
class P
attr_accessor :p
def !@
p < 0.5
end
end
所有的双刘海可能有点难看,但从正面来看,它可能会让人们注意到一些不标准的事情正在发生。没有“强制转换为布尔”运算符,因为正如大卫所指出的那样,falsiness与false
和nil
是硬连接的,任何不“falsy”的都是真的。但是,有一个逻辑求反运算符,如果您不介意显式转换为布尔值,则可以执行此操作:
class P
attr_accessor :p
def !@
p < 0.5
end
end
所有的双刘海可能有点难看,但从正面来看,它可能会让人们注意到一些不标准的事情正在发生。首先,您不需要Float子类。对数字类型子类化感兴趣的人可以查看 实现您想要实现的目标的简单方法是使用以下方法:
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
P类
def初始化p@p=p
除非0为真,否则升高“超出范围”
q、 失败?#=>假的
记住,对于这种情况,Ruby有方法。首先,您不需要Float子类。对数字类型子类化感兴趣的人可以查看 实现您想要实现的目标的简单方法是使用以下方法:
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
P类
def初始化p@p=p
除非0为真,否则升高“超出范围”
q、 失败?#=>假的
请记住,对于这种情况,Ruby有方法。如果您查看源代码,您会发现
Qfalse
、Qtrue
和Qnil
的硬连接值;在ruby.h
中查找enum ruby_special_consts
,你会看到下面的C枚举和一些#define
的定义。如果你浏览源代码,你会找到Qfalse
、Qtrue
和Qnil
的硬连接值;在ruby.h
中查找enum ruby_special_consts
,你会看到C枚举和一些#define
就在下面。@lulalala:我认为一个独特的方法更能证明未来,很有可能将来有人会看到双刘海,并在不知道操作员过载的情况下将其取出。@lulalala:我认为一种独特的方法更能证明未来,有人很有可能在不知道操作员过载的情况下看到双刘海并将其取出。