Что значит уступить в блоке? - PullRequest
       30

Что значит уступить в блоке?

5 голосов
/ 14 сентября 2009
  def any?
    if block_given?
      method_missing(:any?) { |*block_args| yield(*block_args) }
    else
      !empty?
    end
  end

В этом коде ActiveRecord, какова цель оператора yield, существующего в блоке?

Ответы [ 3 ]

10 голосов
/ 14 сентября 2009

В основном, если текущему методу был задан кодовый блок (вызывающий объект при его вызове), yield выполняет кодовый блок, передавая указанные параметры.

[1,2,3,4,5].each { |x| puts x }

Теперь { |x| puts x} - это кодовый блок (x - это параметр), передаваемый каждому методу Array. Реализация Array#each будет перебирать себя и вызывать ваш блок несколько раз с x = each_element

pseudocode
def each
  #iterate over yourself
    yield( current_element )
end

Отсюда и получается

1
2
3
4
5

*block_args - это способ Ruby принять неизвестное количество параметров в виде массива. Вызывающая сторона может передавать блоки с разным количеством аргументов.

Наконец, давайте посмотрим, что делает доходность в блоке.

class MyClass
  def print_table(array, &block)
    array.each{|x| yield x}
  end
end

MyClass.new.print_table( [1,2,3,4,5] ) { |array_element| 
    10.times{|i| puts "#{i} x #{array_element} = #{i*array_element}" }
    puts "-----END OF TABLE----"
  }

Здесь Array#each возвращает каждый элемент в блок, заданный для MyClass#print_table ...

6 голосов
/ 14 сентября 2009

Это не значит ничего особенного. Это просто доходность, как и любой другой доход.

def test_method
  ["a", "b", "c"].map {|i| yield(i) }
end

p test_method {|i| i.upcase }
# => ["A", "B", "C"]

В фрагменте кода из активной записи цель состоит в том, чтобы выдавать каждый раз, когда вызывается блок any?.

0 голосов
/ 27 ноября 2014

Это помогло мне понять: yield - это способ вставить блоки в метод, который вы уже написали, что означает «выполнить что-то здесь» Например,

без параметра

def original_method
   puts "a"
   puts "b"
end

Что если вы хотите выполнить какой-то неизвестный блок между этими двумя p?

def updated_method
   puts "a"
   yield
   puts "b"
end

# these two are the same:
updated_method { puts "execute something here" }
updated_method do puts "execute something here" end

Результат будет

a
execute something here
b

Вы можете иметь в методе столько yield, сколько вам нужно.

с параметром

def updated_method
   puts "a"
   yield
   puts "b"
end

Что если вы хотите выполнить какой-то неизвестный блок в строке "Execute something on me!"?

def updated_method_with_argument
   puts "a"
   yield("Execute something on me!")
   puts "b"
end

updated_method_with_argument do |argument|
  puts "This argument gets put out: " << argument
end

Результат будет

a
This argument gets put out: Execute something on me!
b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...