7

我知道一些方法来检查参数是否不为零

if param[:some_value]
if param[:some_value].present?
if !param[:some_value].nil?    #unless param[:some_value].nil? 
if !param[:some_value].blank?  #unless param[:some_value].blank? 

哪一个是正确的和最受欢迎的?它们之间有什么区别?我宁愿使用if param[:some_value]它,因为它最简单、最短。

4

4 回答 4

15

以下是和之间nil?的一些区别:blank?present?

>> "".nil?
=> false
>> "".blank?
=> true
>> "".present?
=> false
>> " ".nil?
=> false
>> " ".blank?
=> true
>> " ".present?
=> false

请注意,present?转换为not nil and not blank. 另请注意,whilenil?由 Ruby 提供,blank?并且present?是 Rails 提供的帮助程序。

那么,该选择哪一个呢?当然,这取决于您想要什么,但是在评估 params[:some_value] 时,您通常不仅要检查它是否为 nil,还要检查它是否为空字符串。这两个都被present?.

于 2012-08-19T09:51:19.907 回答
3

相关案例有:

  1. 散列缺少键(及其值)
  2. 哈希具有nil键的值
  3. 散列的值为空字符串 ( "") 或空数组 ( []) 的键
  4. 哈希对键有一些其他值

根据您要绘制线条的位置,使用适当的方法。

  • 1 对 2、3、4:!param.key?(:some_value)
  • 1、2 对 3、4:param[:some_value].nil?
  • 1、2、3 对 4:param[:some_value].blank?
  • 2、3、4 对 1:param.key?(:some_value)
  • 3、4 对 1、2:param[:some_value]
  • 4 对 1、2、3:param[:some_value].present?
于 2012-08-19T12:30:37.670 回答
2

if param[:some_value]是最常见的一种。

但是,如果您使用的是布尔数据 ( true, false),最好的方法是if !param[:some_value].nil?,因为:

>> hash = {foo:false, bar:nil}

>> !! hash[:foo]
=> false
>> !! hash[:bar]
=> false

>> !! !hash[:foo].nil?
=> true
>> !! !hash[:bar].nil?
=> false

(!! returns the boolean value, which would be tested in an if-statement)

Also it could be important to test if the value is really nil, or if the key-value combo isn't defined. key?(key) does that for you.

>> hash ={foo:nil}

>> hash[:foo]
=> nil
>> hash[:not_there]
=> nil

>> hash.key?(:foo)
=> true
>> hash.key?(:not_there)
=> false
于 2012-08-19T18:36:32.660 回答
1

这取决于你想做什么,但我通常使用这些形式:

if param[:some_value]
  ...
end

# and
param[:some_value] && something
# or
param[:some_value] || somethinn

当然,所有这些都只有在参数不能为时才有效false。在那种情况下,我会选择unless param[:some_value].nil?版本。

于 2012-08-19T07:51:03.147 回答