Синтаксис Ruby (on Rails) - PullRequest
       4

Синтаксис Ruby (on Rails)

0 голосов
/ 20 января 2012

Я снова работаю над «Учебником по 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}"

Что именно происходит со структурой этой строки?

На более высоком уровне, где находится источник перехода, чтобы искать подобные вещи?

Ответы [ 7 ]

4 голосов
/ 20 января 2012
3 голосов
/ 20 января 2012

Внутри строки в двойных кавычках все, что находится внутри # {}, интерпретируется как код, и результат встраивается в строку, поэтому ожидаемый результат будет таким:

"<значение base_title> | <значение переменной экземпляра заголовка>".

3 голосов
/ 20 января 2012

Самый полезный способ изучить это с 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.

2 голосов
/ 20 января 2012

#{} - переменная интерполяция внутри строки. Думайте об этом как о более кратком способе сказать

base_title + " | " + @title

В этом случае он может быть не намного короче, но когда у вас длинные строки с большим количеством мелких деталей, это улучшает читаемость.

Связанная функция, представленная в Ruby 1.9, - это интерполяция с использованием %:

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

, что также позволяет форматировать (числа и т. Д.). См. Документы .

1 голос
/ 20 января 2012

Эта строка возвращает строку со значениями base_title и @title, интерполированными в результате двойных кавычек. В этом случае base_title является локальной переменной, в то время как @title является переменной экземпляра - вероятно, принадлежащей тому, какой метод в контроллере вызывается.

Для получения дополнительной информации проверьте здесь:
при интерполяции строк
В поле действия

1 голос
/ 20 января 2012

Это просто строка с интерполяцией.Так как методы Ruby возвращают значение последнего вычисленного выражения без явного return, в случае title, являющегося nil, будет возвращена строка в ветви else.

1 голос
/ 20 января 2012

В ruby ​​#{} используется в строках для вставки переменных.Это называется интерполяцией.

В этом конкретном фрагменте кода, если заголовок существует, он добавляется к базовому заголовку, например.

title: "Super Thingo"

становится

"Mega Project | Super Thingo"

Если заголовок не существуетон просто возвращается к основному названию.

...