代码之家  ›  专栏  ›  技术社区  ›  Convincible

Ruby中的if语句是否调用特定的对象方法?

  •  0
  • Convincible  · 技术社区  · 7 年前

    也许我还不太了解一些基本的东西,但我想知道,在为一个对象计算它时,是否调用了某个对象的特定方法 if

    所以,在下面。。。

    my_object = MyObject.new
    
    if !my_object
      puts 'Hello, world!'
    end
    
    class MyObject
      def ___
        return false
      end
    end
    

    ……有什么办法吗 ___ 如果 ,以便我可以确定条件的结果?(在上面的例子中,输出为“你好,世界!”)

    或者,从定义的角度来看,我还有别的办法吗 MyObject ,控制如何在 陈述

    谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jörg W Mittag    7 年前

    有什么办法吗 ___ if

    不,不幸的是没有。不幸的是,Ruby不是面向对象的。

    Ruby中只有两个falsy对象: false nil . 其他一切都是真实的,包括在某些其他语言中被视为虚假的对象,例如整数 0 ,浮子 0.0 ,空字符串 '' ,空数组 [] ,以及空哈希 {} .

    面向对象的基本支柱之一是对象可以相互模拟。事实上,有些人认为这是错误的 定义面向对象的特征。然而,没有办法进行模拟 错误的 用红宝石做的。

    ! ,但这将是欺骗,因为它不会影响对象本身的真值:

    class MyObject
      def !
        true
      end
    end
    
        2
  •  1
  •   Jay Dorsey    7 年前

    if 如果变量不是 nil false (如果未定义变量,则会出错)。我不确定是否有一种方法可以覆盖一个定义为返回nil或false的对象(这对大多数Ruby程序员来说并不混乱),但我很想听听其他人的意见。

    无 错误的 重视并使用它:

    class MyObject
      def foo?
        false
      end
    end
    
    obj = MyObject.new
    
    if obj.foo?
      puts "true"
    else
      puts "false"
    end
    

    new 方法返回布尔值,而不是对象。

    class MyObject
      attr_reader :var
    
      def initialize(*args)
        args.each do |a|
          puts a
        end
      end
    
      def self.new(*args, &block)
        super
        false
      end
    end
    
    my_object = MyObject.new(:a, :b)
    
    if !my_object
      puts 'Hello, world!'
    end
    
    
    my_object = MyObject.new
    
    if !my_object
      puts 'Hello, world!'
    end
    

    defined? , is_a? , nil?