Для чего нужны эти символы в Ruby? - PullRequest
67 голосов
/ 20 марта 2009

Для чего нужны символы канала в 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 ]

50 голосов
/ 20 марта 2009

Это переменные, передаваемые блоку.

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».

30 голосов
/ 24 июля 2012

Поначалу мне это тоже было очень странно, но я надеюсь, что это объяснение / пошаговое руководство поможет вам.

Документация довольно хорошо затрагивает тему - если мой ответ не поможет, я уверен, что их руководство поможет.

Сначала запустите интерпретатор Interactive 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| может быть чем угодно, если вы используете его последовательно. И поймите, что речь идет о петлях, о которых я не узнал позже.

6 голосов
/ 05 марта 2012
@names.each do |name|
  puts "Hello #{name}!"
end

в http://www.ruby -lang.org / ru / Documentation / quickstart / 4 / сопровождается этим объяснением:

each - это метод, который принимает блок кода, затем запускает этот блок кода для каждого элемента в списке, и бит между do и end является именно таким блоком. Блок похож на анонимную функцию или lambda. Переменная между символами канала является параметром для этого блока.

В данном случае происходит то, что для каждой записи в списке name привязывается к этому элементу списка, а затем выполняется выражение puts "Hello #{name}!" с этим именем.

6 голосов
/ 20 марта 2009

Код от do до end определяет Ruby block . Слово format является параметром для блока. Блок передается вместе с вызовом метода, и вызываемый метод может yield значения для блока.

Подробности смотрите в любом тексте на Ruby, это основная функция Ruby, которую вы будете видеть постоянно.

3 голосов
/ 20 марта 2009

Параметры для блока сидят между символами |.

3 голосов
/ 20 марта 2009

Эквивалентом в 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();
    }
});
1 голос
/ 27 апреля 2017

Чтобы сделать его еще более понятным, при необходимости:

столбцы конвейера по существу создают новую переменную для хранения значения, сгенерированного из предыдущего вызова метода Что-то похожее на:

Исходное определение вашего метода:

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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...