问题
I am working back through the "Ruby on Rails 3 Tutorial" and trying to understand the syntax at a deeper level. Here is some example code from a helper action that I have defined:
module ApplicationHelper
def title
base_title = "Mega Project"
if @title.nil?
base_title
else
"#{base_title} | #{@title}"
end
end
end
My question is about the line: "#{base_title} | #{@title}"
What exactly is going on with the structure of this line?
On a higher level, where is the go-to source to look up things like this?
回答1:
Within a double quoted string the anything within the #{}s get interpreted as code and the result is embedded in the string so the result you'd expect there is:
"<value of base_title> | <value of title instance variable>".
回答2:
String interpolation: http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Literals#Interpolation
回答3:
The most useful way to explore this is with 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"
What's actually happening here is that you have a local variable base_title
that holds a string and an instance variable @title
that also holds a string. The string with hashes and so on is formatting those variables using string interpolation - a special string syntax that causes the interpreter to plug the variables' values into string when you evaluate it. Here's a good post about it.
I'd recommend getting a book on Ruby.
回答4:
#{}
is variable interpolation within a string. Think of it as a more concise way of saying
base_title + " | " + @title
In this case it may not be much shorter but when you have long strings with lots of little parts it enhances readability.
A related feature introduced in Ruby 1.9 is interpolation using %
:
"%s | %s" % [base_title, @title]
which also allows for formatting (numbers, etc). See the docs.
回答5:
In ruby #{}
is used within strings to insert variables. This is called Interpolation.
In this particular piece of code, if a title exists it is added to the base title eg.
title: "Super Thingo"
becomes
"Mega Project | Super Thingo"
If no title exists, it just falls back on the base title.
回答6:
It's just a string with interpolation. Since Ruby methods return the value of the last evaluated expression without an explicit return
, in the case of title
being nil
the string in the else
branch will be returned.
回答7:
That line is returning a String with the value of base_title
and @title
interpolated as a result of the double quotes. In this instance, base_title
is a local variable while @title
is an instance variable - likely belonging to whatever method in the controller is being called.
For more information check here:
On String Interpolation
On Scope
来源:https://stackoverflow.com/questions/8944125/ruby-on-rails-syntax