【问题标题】:how to make my custom class to be evaluated as Falsey in Ruby如何使我的自定义类在 Ruby 中被评估为 False
【发布时间】:2022-11-30 16:56:53
【问题描述】:

例如

MyClass = Class.new(Object)

a = MyClass.new
unless a
  puts "executed"
end

我知道 nilfalse 是 Ruby 中仅有的两个评估为 false 的值。但我也需要将 MyClass 的实例评估为错误。有可能这样做吗?

nilfalse 是 Ruby 中仅有的两个评估为 false 的值

我也在尝试找出它在CRuby中定义的位置

我知道这种用法并不常见,我之所以要这样做:https://github.com/exAspArk/batch-loader/issues/84

【问题讨论】:

    标签: ruby


    【解决方案1】:

    如何让我的自定义类在 Ruby 中被评估为 Falsey

    你不能。 nilfalse 是仅有的两个计算结果为假的在红宝石中。

    但是我也需要将 MyClass 的实例评估为错误。有可能这样做吗?

    不,这是不可能的,因为 nilfalse 是仅有的两个评估为假的在红宝石中。

    见第 6.6 节布尔值ISO/IEC 30170:2012 Information technology — Programming languages — Ruby specification 的,例如:

    6.6 布尔值

    一个对象被分类为真实的对象虚假的对象.

    仅有的错误的是虚假的对象。错误的是类FalseClass(见 15.2.6)的唯一实例,虚假表达评估(见 11.5.4.8.3)。是类NilClass(见 15.2.4)的唯一实例,零表达式评估(见 11.5.4.8.2)。

    对象以外的错误的分为真实的物体.真的是类TrueClass(见 15.2.5)的唯一实例,真实表达评估(见 11.5.4.8.3)。

    如果你检查第 11.2 节逻辑表达式, 11.5.2.2条件表达式, 11.5.2.3.2while 表达式, 11.5.2.3.3until 表达式,或规范核心库部分中各种方法契约的各种定义,例如 15.2.2.4.33Module#instance_methods,你会发现他们总是只谈真实的虚假的对象,但绝不允许任何协议询问对象的真实性或虚假性或更改真假的定义。

    不幸的是,这不是正确的面向对象设计(在 OO 中,一个对象总是可以模拟另一个对象),但是您对此无能为力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-15
      • 2014-01-19
      • 2022-11-27
      • 1970-01-01
      • 2020-09-08
      • 1970-01-01
      • 2016-09-23
      • 2018-06-13
      相关资源
      最近更新 更多