gpt4 book ai didi

ruby - 如何在 Ruby 的 block 中提供类/对象方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:20 25 4
gpt4 key购买 nike

有时你可以看到:

do_this do
available_method1 "arg1"
available_method2 "arg1"
end

当我使用 do_this 方法中的 block 时,我会得到一些可以在该 block 内使用的方法。

我想知道这是如何实现的?代码在幕后看起来如何?

我希望能够通过 block 提供一些方法。

最佳答案

它被称为领域特定语言 (DSL)。 Here's (Last archived version)关于各种形式的 Ruby DSL block 的一些重要信息。

实际上有两种方法可以做到这一点,使用不同的语法:

do_thing do |thing| # with a block parameter
thing.foo :bar
thing.baz :wibble
end

# versus

do_thing do # with block-specific methods
foo :bar
baz :wibble
end

第一个更明确并且不太可能失败,而第二个更简洁。

第一个可以像这样实现,只需将一个新实例作为 block 参数传递给 yield:

class MyThing
def self.create
yield new
end

def foo(stuff)
puts "doing foo with #{stuff}"
end
end

MyThing.create do |thing|
thing.foo :bar
end

第二个,它在新对象的上下文中运行该 block ,使其能够访问 self、实例变量和方法:

class MyThing
def self.create(&block)
new.instance_eval &block
end

def foo(stuff)
puts "doing foo with #{stuff}"
end
end

MyThing.create do
foo :bar
end

如果您真的想在不调用 MyThing.create 的情况下执行此操作,只需:

def create_thing(&block)
MyThing.create &block
end

关于ruby - 如何在 Ruby 的 block 中提供类/对象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3435756/

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