gpt4 book ai didi

ruby - 我可以动态定义一个采用 block 的 Ruby 方法吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:53:42 24 4
gpt4 key购买 nike

我知道我可以使用 define_method 在类上动态定义方法,并且我使用 block 的元数指定此方法采用的参数。

我想动态定义一个接受可选参数和 block 的方法。在 Ruby 1.9 中,这很容易,因为现在允许将 block 传递给 block 。

不幸的是,Ruby 1.8 不允许这样做,所以下面的方法将不起作用:

#Ruby 1.8
class X
define_method :foo do |bar, &baz|
puts bar
baz.call if block_given?
end
end

x = X.new
x.foo("foo") { puts "called!"} #=> LocalJumpError: no block given

yield 替换显式 block.call 也不能解决问题。
不幸的是,升级到 Ruby 1.9 不是我的选择。这是一个棘手的问题,还是有解决办法?

最佳答案

这适用于 Ruby 1.8.7,但不适用于 1.8.6:

class X
define_method(:foo) do |bar, &baz|
puts bar
baz.call if baz
end
end

测试:

X.new.foo("No block")
X.new.foo("With block") { puts " In the block!"}
p = proc {puts " In the proc!"}
X.new.foo("With proc", &p)

给出:

No block
With block
In the block!
With proc
In the proc!

(对于 1.8.6,它给出了语法错误,意外的 tAMPER,期待“|”。)

如果你想要可选参数以及 block ,你可以尝试这样的事情:

class X
define_method(:foo) do |*args, &baz|
if args[0]
bar = args[0]
else
bar = "default"
end
puts bar
baz.call if baz
end
end

测试:

X.new.foo
X.new.foo { puts " No arg but block"}

给出:

default
default
No arg but block

关于ruby - 我可以动态定义一个采用 block 的 Ruby 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7562865/

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