gpt4 book ai didi

ruby - 如何使用 'do' 关键字语法创建接受匿名函数的函数?

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:37 26 4
gpt4 key购买 nike

当使用 array.each 时,您可以用两种形式指定函数:

花括号:

a = [1,2,3]
a.each { |x| puts x * x }

输出:

1
4
9
=> [1, 2, 3]

'do'语法:

a = [1,2,3]
a.each do |x|
puts (x * x)
end

输出:

1
4
9
=> [1, 2, 3]

问题:如何使用我自己的自定义函数复制“do”语法样式?我能得到的最接近花括号样式的是:

我尝试过的:

def PutWith2Arg(proc)
puts proc.call(2)
end

PutWith2Arg(Proc.new { |x| x + 100 })

输出:

102
=> nil

最佳答案

做|foo| …结束{ |foo| ... 语法是等价的。这些是 Ruby 中的“ block ”,任何方法都可以获取它们。要给他们打电话,您需要:

def my_method               # No need to declare that the method will get a block
yield(42) if block_given? # Pass 42 to the block, if supplied
end

my_method do |n|
puts "#{n} times 2 equals #{n*2}"
end
#=> "42 times 2 equals 84"

my_method{ |n| puts "#{n} times 2 equals #{n*2}" }
#=> "42 times 2 equals 84"

my_method # does nothing because no block was passed

或者,对于更复杂的用途:

def my_method( &blk ) # convert the passed block to a Proc named blk
blk.call( 42 ) if blk
end

# Same results when you call my_method, with or without a block

当您需要将 block 传递给另一个方法时,后一种样式很有用。如果您有一个变量引用的 Proc 或 Lambda,您可以使用 & 语法将它作为该方法的 block 传递给方法:

def my_method( &blk )   # convert the passed block to a Proc named blk
[1,2,3].each( &blk ) # invoke 'each' using the same block passed to me
end
my_method{ |x| p x=>x**2 }
#=> {1=>1}
#=> {2=>4}
#=> {3=>9}

更多详情,this webpage很有启发性。

关于ruby - 如何使用 'do' 关键字语法创建接受匿名函数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com