我正在回顾“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}"
这条线的结构到底发生了什么?
在更高的层面上,查找此类内容的首选来源在哪里?
答案 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
,因此在title
为nil
的情况下,将返回else
分支中的字符串。< / p>
答案 6 :(得分:1)
该行返回一个字符串,其值为base_title
,@title
作为双引号的结果进行插值。在这种情况下,base_title
是一个局部变量,而@title
是一个实例变量 - 可能属于调用控制器中的任何方法。
有关详细信息,请查看此处:
On String Interpolation
On Scope