Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在一个街区内屈服意味着什么?_Ruby - Fatal编程技术网

Ruby 在一个街区内屈服意味着什么?

Ruby 在一个街区内屈服意味着什么?,ruby,Ruby,在ActiveRecord中的这段代码中,存在于块中的yield语句的用途是什么?基本上,如果当前方法已被赋予一个代码块(由调用方调用),则yield执行传入指定参数的代码块 def any? if block_given? method_missing(:any?) { |*block_args| yield(*block_args) } else !empty? end end 现在,{x | put x}是传递给数组的每个方法的代码

在ActiveRecord中的这段代码中,存在于块中的yield语句的用途是什么?

基本上,如果当前方法已被赋予一个代码块(由调用方调用),则
yield
执行传入指定参数的代码块

  def any?
    if block_given?
      method_missing(:any?) { |*block_args| yield(*block_args) }
    else
      !empty?
    end
  end
现在,
{x | put x}
是传递给
数组
的每个方法的代码块(
x
是一个参数)。
Array#每个
实现都会迭代自身,并使用
x=each_元素多次调用您的块

[1,2,3,4,5].each { |x| puts x }
因此,它的结果

pseudocode
def each
  #iterate over yourself
    yield( current_element )
end
*block_args
是一种Ruby方式,用于接受未知数量的参数作为数组。调用方可以传入具有不同数量参数的块

最后,让我们看看区块内的收益率

1
2
3
4
5

在这里,
Array#每个
将每个元素生成给
MyClass#print_table
的块

它并不意味着任何特殊的内容。这只是一个收益率,就像其他收益率一样

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----"
  }

在active record的代码片段中,目的是每次调用
any?
的块时都要生成。

这有助于我理解:
yield
是一种将块插入到您已经编写的方法中的方法,这意味着“在此处执行某些东西”。比如说,

无参数 如果要在这两个
p
之间执行某个未知块,该怎么办

def original_method
   puts "a"
   puts "b"
end
结果将是

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
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
在一个方法中,您可以有任意多个
yield
s

带参数 如果要在字符串
“在我身上执行某物!”
上执行某个未知块,该怎么办


这有助于记住,块包括周围方法的范围,因此它实际上与在其他任何地方产生完全相同。
yield
无论如何都不关心范围。
a
execute something here
b
def updated_method
   puts "a"
   yield
   puts "b"
end
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