Ruby中的布尔值

时间:2012-08-24 13:17:15

标签: ruby-on-rails ruby ruby-on-rails-3.2

我有一个方法,它有一个布尔值作为参数。我知道最好避免使用布尔值。无论如何,在我的情况下,这是最有效的方式。

嗯,这是一个方法:

  def some_method(include_some_values = false)
          #do some workcountries = []
          if include_some_values 
             #do some additional work  
           end
           #return value
    end

致电(haml)

= form_for @address do |f|
  = f.select :fied1, MyModel.some_method(true) #it's okay

但是,如果我将其称为

= f.select :fied1, MyModel.some_method true 

= f.select :fied1, MyModel.some_method :true 

= f.select :fied1, MyModel.some_method false 

= f.select :fied1, MyModel.some_method :false 
然后它不会起作用。为什么呢?

2 个答案:

答案 0 :(得分:4)

可能

= f.select :fied1, MyModel.some_method true

被解释为:

= f.select(:fied1, MyModel.some_method) true

所以只需使用括号来避免歧义。

PS::true是一个符号,所以如果你处理布尔值,就没有理由摆弄符号。

答案 1 :(得分:4)

如果您的问题在不使用括号时出现问题,则与布尔值无关,而与Ruby解析器有关。

在某些情况下,将方法作为参数传递给另一个方法需要括号:

def a_method(value)
   puts value
end

def one_argument(value)
   puts value
end

def two_arguments(value1, value2)
   puts value1 + value2
end

# These snippets work fine
one_argument a_method 15
one_argument a_method(15)
two_arguments 999, a_method(15)
# ... etc ...

# This one doesn't
two_arguments 999, a_method 15

最后一个例子(就像你在问题中所做的那样)对Ruby解析器来说是不明确的,所以你得到一个错误。