Каковы эти символы труб в 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?
Ответы
Ответ 1
Это переменные, которые даются блоку.
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".
Ответ 2
Сначала это было очень странно, но я надеюсь, что это объяснение /walkthru поможет вам.
Документация затрагивает тему, неплохо - если мой ответ не поможет, я уверен, что их руководство будет.
Сначала запустите интерпретатор Interactive Ruby, набрав irb
в вашей оболочке и нажав Enter.
Введите что-то вроде:
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|
может быть чем угодно, если вы используете его последовательно. И поймите, что это циклы, о которых мы говорим, это было то, чего я не получил до этого.
Ответ 3
Код от do
до end
определяет блок Ruby. Слово format
является параметром блока. Блок передается вместе с вызовом метода, а вызываемый метод может yield
принимать значения в блоке.
Подробнее см. любой текст на Ruby, это основная особенность Ruby, которую вы будете видеть все время.
Ответ 4
@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}!"
запускается с этим именем.
Ответ 5
Эквивалент в 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();
}
});
Ответ 6
Параметры для блока располагаются между символами |
.
Ответ 7
Чтобы сделать его еще более понятным, если необходимо:
полоски труб, по существу, делают новую переменную для хранения значения, генерируемого при вызове метода ранее. Что-то похожее на:
Исходное определение вашего метода:
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!