Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中可以计算为false(模糊逻辑)的浮点子类_Ruby_Boolean_Fuzzy Logic - Fatal编程技术网

在Ruby中可以计算为false(模糊逻辑)的浮点子类

在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的主要开发者之一进

我需要一个可以表示概率的类。它可以表示为介于0和1之间的浮点,低于0.5的任何值都应计算为false。(也可以介于1和-1之间,任何负值都是假的)


从这一点看来,它似乎表明这是可能的:每个对象都有一个布尔值。。。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:我认为一种独特的方法更能证明未来,有人很有可能在不知道操作员过载的情况下看到双刘海并将其取出。