0

我正在研究“Ruby on Rails 3 教程”并尝试更深入地理解语法。这是我定义的辅助操作的一些示例代码:

module ApplicationHelper

  def title
    base_title = "Mega Project"
    if @title.nil?
      base_title
    else
      "#{base_title} | #{@title}"
    end
  end

end

我的问题是关于这条线:"#{base_title} | #{@title}"

这条线的结构到底是怎么回事?

在更高的层次上,查找此类内容的首选来源在哪里?

4

7 回答 7

4

字符串插值: http ://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation

于 2012-01-20T15:57:25.673 回答
3

探索这个最有用的方法是irb

1.9.2p290 :001 > base_title = "things"
 => "things" 
1.9.2p290 :002 > title = "stuff"
 => "stuff" 
1.9.2p290 :003 > "#{base_title} | #{title}"
 => "things | stuff" 

这里实际发生的是,您有一个保存字符串的局部变量base_title和一个也保存字符串的实例变量@title。带有散列等的字符串正在使用字符串插值格式化这些变量 - 一种特殊的字符串语法,当您评估它时,它会导致解释器将变量的值插入字符串。这是一篇关于它的好帖子。

我建议买一本关于 Ruby 的书。

于 2012-01-20T15:59:57.997 回答
3

在双引号字符串中,#{} 中的任何内容都被解释为代码,结果嵌入在字符串中,因此您期望的结果是:

“<base_title 的值> | <title 实例变量的值>”。

于 2012-01-20T16:00:01.630 回答
2

#{}是字符串内的变量插值。把它想象成一种更简洁的表达方式

base_title + " | " + @title

在这种情况下,它可能不会短很多,但是当你有很多小部分的长字符串时,它会提高可读性。

Ruby 1.9 中引入的一个相关特性是使用插值%

"%s | %s" % [base_title, @title]

这也允许格式化(数字等)。请参阅文档

于 2012-01-20T16:09:16.220 回答
1

在 ruby#{}​​ 中,用于在字符串中插入变量。这称为插值。

在这段特定的代码中,如果存在标题,则将其添加到基本标题中,例如。

title: "Super Thingo"

变成

"Mega Project | Super Thingo"

如果不存在标题,则它只是回退到基本标题。

于 2012-01-20T15:59:21.197 回答
1

它只是一个带有插值的字符串。由于 Ruby 方法返回最后一个评估表达式的值而没有显式return的 ,因此如果是分支titlenil的字符串,else则将返回。

于 2012-01-20T16:00:25.670 回答
1

该行返回一个字符串,其值为base_title@title作为双引号的结果进行插值。在这种情况下,base_title是一个局部变量,而@title是一个实例变量 - 可能属于正在调用的控制器中的任何方法。

有关更多信息,请在此处查看:范围内的
字符串插值

于 2012-01-20T16:02:05.357 回答