RoR教程第4.1.1章,混淆了为什么标题助手不会失败

时间:2012-02-12 04:04:37

标签: ruby-on-rails ruby railstutorial.org

我正在阅读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值?但它也不是空的?为什么不:标题被视为非空?如果有人能让我明白这一点,那就太好了。

1 个答案:

答案 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