Для чего нужны эти символы трубы в 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}!" endat 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!