Каковы эти символы труб в 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!