我正在阅读Michael Hartl的Ruby on Rails 3.2教程,我很困惑为什么4.1.1节中的标题助手没有失败。
如果你从视图中省略了这段代码,他谈到需要一个标题助手:
<% provide(:title, 'Home') %>
但是在应用程序布局文件中有这一行:
<title><%= full_title(yield(:title)) %></title>
这是不是将nil值传递给full_title助手,因为提供没有为:title符号设置值?
在本章的后面,他有一个在rails控制台中输入的示例,它与full_title函数相同:
def string_message(string)
if string.empty?
"It's an empty string!"
else
"The string is nonempty."
end
end
这使我更加困惑。
在控制台,如果我输入:
string_message("")
然后我得到"It's an empty string!"
string_message("something")
然后我得到"The string is nonempty."
string_message(nil)
然后我得到NoMethodError: undefined method 'empty?' for nil:NilClass
string_message(test)
然后我得到ArgumentError: wrong number of arguments (0 for 2..3)
string_message(:test)
然后我得到"The string is nonempty."
因此传递未定义的符号不会导致nil值?但它也不是空的?为什么不:标题被视为非空?如果有人能让我明白这一点,那就太好了。
答案 0 :(得分:1)
虽然你的论点是“字符串”,但不要挂断它必须是一个字符串。有人可以将任何参数传递给函数,它是否会在函数中出现问题,实际上只取决于该对象是否响应“空”?消息。
致电时
string_message("")
对
的呼吁"".empty?
评估为真。
当你传递一个nil对象时,nil不支持空?消息,所以它会抛出错误
当您抛出任意符号时
string_message(:pigs_on_the_wing)
您要将空消息发送到:pigs_on_the_wing,这是一个符号。符号定义“空?”仅当符号的主体为“”时才返回true。
例如,在irb:
:"".empty? # true
:pigs_on_the_wing.empty? #false
您可以随时直接找到来源:
http://www.ruby-doc.org/core-1.9.3/Symbol.html#method-i-empty-3F