gpt4 book ai didi

Ruby:将 block 传递给定义实例方法的类宏

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

我正在努力处理看起来像下面示例的代码(但实际上做了一些有用的事情)。当我想在具有实例方法的实例的上下文中评估它时,传递给 def_my_method 的 block 当然是在类的上下文中创建的。我该怎么做?

module Formatters
# Really useful methods, included in several classes
def format_with_stars(str)
return "*** #{str} ***"
end
end

class Test
include Formatters
STRINGS = ["aa", "bb"]

def self.def_my_method(method_name, another_parameter, &format_proc)
define_method(method_name) do
# In reality, some more complex code here, then...
return STRINGS.map(&format_proc)
end
end

def_my_method(:star_strings, "another_parameter") { |str| format_with_stars(str) }
# Define other methods
end

tt = Test.new
puts tt.star_strings
# Throws undefined method `format_with_stars' for Test:Class (NoMethodError)

最佳答案

您可以使用 instance_exec 在正确的上下文中执行传递的 block 。不要将 &format_proc 直接传递给对 map 的调用,而是传递一个使用实例 exec 调用它的 block 。

像这样:

def self.def_my_method(method_name, another_parameter, &format_proc)
define_method(method_name) do
# In reality, some more complex code here, then...
return STRINGS.map{|str| instance_exec(str, &format_proc)}
end
end

这会产生这个:

$ ruby tt.rb 
*** aa ***
*** bb ***

对我来说(其中 tt.rb 是我给文件的任意名称),我认为这就是您想要的这个示例。

关于Ruby:将 block 传递给定义实例方法的类宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4135799/

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