Ruby(on Rails)语法

时间:2012-01-20 15:53:45

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

我正在回顾“Ruby on Rails 3 Tutorial”并试图在更深层次上理解语法。以下是我定义的辅助操作的一些示例代码:

module ApplicationHelper

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

end

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

这条线的结构到底发生了什么?

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

7 个答案:

答案 0 :(得分:4)

答案 1 :(得分: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,它也包含一个字符串。带有哈希等的字符串是使用字符串插值格式化这些变量 - 一种特殊的字符串语法,使得解释器在评估时将变量的值插入字符串。这是关于它的good post

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

#{}是字符串中的变量插值。把它想象成一种更简洁的说法

base_title + " | " + @title

在这种情况下,它可能不会短得多,但是当你有很多小部件的长琴弦时,它会提高可读性。

Ruby 1.9中引入的相关功能是使用%进行插值:

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

还允许格式化(数字等)。请参阅the docs

答案 4 :(得分:1)

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

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

title: "Super Thingo"

变为

"Mega Project | Super Thingo"

如果不存在标题,它只会回到基本标题上。

答案 5 :(得分:1)

它只是一个带插值的字符串。由于Ruby方法返回上一个已计算表达式的值而没有显式return,因此在titlenil的情况下,将返回else分支中的字符串。< / p>

答案 6 :(得分:1)

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

有关详细信息,请查看此处:
On String Interpolation
On Scope