在ruby中不返回false等同于!变量?

时间:2015-03-20 15:48:39

标签: ruby-on-rails ruby

在我的rails项目中,我在模块中定义了以下方法:

  def self.create_response_backup
    response_backup = ResponseBackup.new(location_name: site.site_name, response_data: response_json)

    if !response_backup
      return response_backup.errors.full_messages.to_sentence
    end

    return response_backup
  end

我的问题是:

如果我这样做,if create_response_backup ... else ... end这个方法应该返回任何真实的东西 - 它会知道跳到其他部分吗?或者,因为它返回的值不是false,它会继续在if语句的顶部吗?

换句话说,我应该这样做:if create_response_backup == true ... else ... end

2 个答案:

答案 0 :(得分:5)

https://gist.github.com/jfarmer/2647362很好地概述了Ruby中的truthy和falsy值。相对于上面的代码,

return response_backup.errors.full_messages.to_sentence

会导致返回一个非零字符串,而后者又会评估为真实。

如果您有if语句:

if create_response_backup
    puts "A"
else
    puts "B"
end

我希望你的代码只能输出A(除非在response_backup.errors.full_messages.to_sentence中的某些内容被评估为nil且引发了nil值错误)

答案 1 :(得分:1)

看起来if create_response_backup将始终评估为true,除非response_backup.errors.full_messages.to_sentence始终为nilfalse

Ruby在true条件下将对象评估为if。您的方法将始终返回ResponseBackup对象或值response_backup.errors.full_messages.to_sentence(我假设它是一个字符串)。

如果要验证备份是否已创建,则可以执行

if create_response_backup.class == ResponseBackup ... else ... end

根据此方法的更广泛范围,您需要决定是否更好地对返回值使用检查或重构该方法以返回true或false。