【问题标题】:Determinate which method returns true in or operator在 or 运算符中确定哪个方法返回 true
【发布时间】:2016-03-02 12:47:00
【问题描述】:

我有:

def user_validation
  first_user_valid? || second_user_valid?
end

我不仅想返回真/假,还想返回哪个方法返回真(可能两者兼而有之?)。我有:

def user_validation
  return true if first_user_valid?
  return true if second_user_valid?
end

到目前为止。但这对我来说似乎不是很直观。

谢谢

【问题讨论】:

  • 您期望每种情况(四种情况)的返回值是多少?

标签: ruby return return-value


【解决方案1】:

您可以返回一个响应数组:

def user_validation
  [first_user_valid?, second_user_valid?]
end

这样就可以知道第一个返回true,另一个返回false...

# => [true, false]

【讨论】:

  • 假设@x = 0: def first_user_valid?; @x == 0; end; def second_user_valid?; (10 % @x) == 2; end?
【解决方案2】:

如果我是你,我会将返回值从 boolean 更改为 int。这样做,您可以处理返回具体数字的语句。

【讨论】:

  • 我会避免为状态硬编码整数。创建难以维护的代码。
  • 返回一个真/假的数组也不是一个好习惯。如果你指定一个带有状态码的列表,那应该是一个很好的实现。
【解决方案3】:

为什么不为不同的用户分别调用方法本身呢?

def user_validation(user)
    return user_valid?
end

if(user_validation(user_1))
    //user_1 is valid
end

if(user_validation(user_2))
    //user_2 is valid
end

【讨论】:

    【解决方案4】:

    只是出于好奇:

    result = %w|first_user_valid second_user_valid|.inject(nil) |memo, m|
      (memo ||= []) << m.tr('_', ' ') if public_send("#{m}?")
      memo
    end
    
    if result # at least one is valid
      puts result.join ', '
    else      # none is valid
      puts 'None is valid :('
    end
    

    这里的结果可能是nil (falsey),也可能是这样的字符串:

    "first user valid, second user valid"
    

    【讨论】:

      【解决方案5】:
      def user_validation
        valid = ((which = :first) && first_user_valid?) || 
         ((which = :second) && second_user_valid?)
        which = :neither unless valid
        [valid, which]
      end
      

      举例说明:

      def first_user_valid?;  true; end
      def second_user_valid?; true; end
      user_validation #=> [true, :first]
      
      def first_user_valid?;  false; end
      user_validation #=> [true, :second]
      
      def second_user_valid?; false; end
      user_validation #=> [false, :neither]
      

      一般来说,在使用|| 时,如果第一个表达式求值true,您不想求值第二个表达式,因为在某些情况下可能引发异常(例如除以零),会产生不良副作用(例如,删除需要的文件)或启动冗长的计算。

      【讨论】:

        猜你喜欢
        • 2019-02-09
        • 2023-01-10
        • 2015-05-19
        • 2020-06-26
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 2015-07-08
        • 2011-02-09
        相关资源
        最近更新 更多