Для чего нужны эти символы трубы в Ruby?
для чего нужны символы труб в Ruby?
Я изучаю Ruby и RoR, исходя из фона PHP и Java, но я продолжаю сталкиваться с таким кодом:
def new
@post = Post.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @post }
end
end
Что такое |format|
часть делаешь? Каков эквивалентный синтаксис этих символов канала в PHP / Java?
7 ответов:
Они являются переменными уступил блока.
def this_method_takes_a_block yield(5) end this_method_takes_a_block do |num| puts num end
выходы "5". Более загадочный пример:
def this_silly_method_too(num) yield(num + 5) end this_silly_method_too(3) do |wtf| puts wtf + 1 end
выход "9".
Это было очень странно для меня тоже сначала, но я надеюсь, что это объяснение/walkthru поможет вам.
документация затрагивает тему, в довольно хороший способ - если мой ответ не поможет, я уверен, что их гид.
во-первых, запустите интерактивный интерпретатор Ruby, введя
irb
в командной строке и нажав введите.типа что-то вроде:
the_numbers = ['ett','tva','tre','fyra','fem'] # congratulations! You now know how to count to five in Swedish.
так что у нас есть массив, чтобы играть. Затем мы создаем цикл:
the_numbers.each do |linustorvalds| puts linustorvalds end
Он выведет все числа, разделенные новыми строками.
на других языках вы должны были бы написать что-то вроде:
for (i = 0; i < the_numbers.length; i++) { linustorvalds = the_numbers[i] print linustorvalds; }
важные вещи, чтобы отметить, что
|thing_inside_the_pipes|
может быть что угодно, пока вы используете его последовательно. И поймите, что это петли, о которых мы говорим, это было то, что я не получил до тех пор, пока позже.
@names.each do |name| puts "Hello #{name}!" end
at http://www.ruby-lang.org/en/documentation/quickstart/4/ сопровождается следующим объяснением:
each
- Это метод, который принимает блок кода, а затем запускает этот блок кода для каждого элемента в списке и бит междуdo
иend
как раз такой блок. Блок похож на анонимную функцию илиlambda
. Переменная между символами канала является параметром для этого блока.что здесь происходит что для каждой записи в списке,
name
привязан к этому элементу списка, а затем выражениеputs "Hello #{name}!"
запускается с этим именем.
код
do
доend
определяет a Руби блок. Словоformat
- это параметр блока. Блок передается вместе с вызовом метода, а метод можетyield
значения в блок.см. любой текст на Ruby для деталей, это основная функция Ruby, которую вы будете видеть все время.
эквивалент в Java будет что-то вроде
// Prior definitions interface RespondToHandler { public void doFormatting(FormatThingummy format); } void respondTo(RespondToHandler) { // ... } // Equivalent of your quoted code respondTo(new RespondToHandler(){ public void doFormatting(FormatThingummy format) { format.html(); format.xml(); } });
чтобы сделать его еще более ясным, если это необходимо:
трубные стержни по существу создают новую переменную для хранения значения, сгенерированного из предыдущего вызова метода. Что-то вроде:
оригинальное определение метода:
def example_method_a(argumentPassedIn) yield(argumentPassedIn + 200) end
как использовать:
example_method_a(100) do |newVariable| puts newVariable; end
это почти то же самое, как писать это:
newVariable = example_method_a(100) puts newVariable
где, newVariable = 200 + 100 = 300: D!