1

我有一个以布尔值作为参数的方法。我知道最好避免使用布尔值。无论如何,就我而言,这是最有效的方式。

好吧,这里有一个方法:

  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 

那么它就行不通了。为什么?

4

2 回答 2

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 解析器来说是模棱两可的,因此您会收到错误消息。

于 2012-08-24T13:31:25.493 回答
4

大概

= f.select :fied1, MyModel.some_method true

被解释为:

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

因此,只需使用括号来避免歧义。

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

于 2012-08-24T13:28:59.737 回答