gpt4 book ai didi

Ruby:在另一个方法中定义一个方法有什么实际用途吗?

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

我正在阅读一篇关于元编程的文章,它表明您可以在另一个方法中定义一个方法。这是我早就知道的事情,但它让我问自己一个问题:这有什么实际应用吗?在方法中定义方法是否有实际用途?

例如:

def outer_method
def inner_method
# ...
end
# ...
end

最佳答案

我最喜欢的元编程示例是动态构建一个您将在循环中使用的方法。例如,我有一个用 Ruby 编写的查询引擎,其中一项操作是过滤。有许多不同形式的过滤器(子字符串、等于、<=、>=、交集等)。天真的做法是这样的:

def process_filter(working_set,filter_type,filter_value)
working_set.select do |item|
case filter_spec
when "substring"
item.include?(filter_value)
when "equals"
item == filter_value
when "<="
item <= filter_value
...
end
end
end

但是,如果您的工作集可能会变大,那么即使每次迭代都采用相同的分支,您也会为每个操作执行 1000 或 1000000 次这种大的 case 语句。在我的例子中,逻辑比 case 语句复杂得多,所以开销更大。相反,您可以这样做:

def process_filter(working_set,filter_type,filter_value)
case filter_spec
when "substring"
def do_filter(item,filter_value)
item.include?(filter_value)
end
when "equals"
def do_filter(item,filter_value)
item == filter_value
end
when "<="
def do_filter(item,filter_value)
item <= filter_value
end
...
end
working_set.select {|item| do_filter(item,filter_value)}
end

现在一次性分支在前面完成一次,生成的单一用途函数是内部循环中使用的函数。

事实上,我的真实示例做了三个级别的操作,因为工作集和过滤器值的解释存在差异,而不仅仅是实际测试的形式。所以我构建了一个 item-prep 函数和一个 filter-value-prep 函数,然后构建了一个使用它们的 do_filter 函数。

(我实际上使用的是 lambda,而不是 defs。)

关于Ruby:在另一个方法中定义一个方法有什么实际用途吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093184/

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