【问题标题】:Ruby - Passing functions as argumentsRuby - 将函数作为参数传递
【发布时间】:2015-04-07 02:04:12
【问题描述】:

我想像这样传递两个函数:

def add_user_review(user_id, movie_id, set=:training)
  check_set set, @training_data.add_user_review(user_id, movie_id), @test_data.add_user_review(user_id, movie_id)
end

check_set 方法如下所示:

# If set is training set, initiate training set function. else, initiate test set function
def check_set(set, training_method, test_method)
  set == :training ? training_method : test_method
end

根据set:training:test),我有两种方法中的一种。 @training_data@test_data 都是来自另一个类的对象,training_method 将始终在 @training_data 上调用,test_method@test_data 也是如此。每种方法都接受不同的参数(即并非所有方法都传递user_idmovie_id)。

我需要重构我的代码以合并 Proc 或其他东西。我该怎么办?

【问题讨论】:

  • 说到堆栈溢出,这不就是调用add_user_review时的结果吗?
  • 你的check_set可以重构为def check_set(_, training_method, _); training_method end
  • 当我调用add_user_review 时产生的错误是未定义的方法add_user_review for nil::NilClass。这是因为@test_data 不存在。该方法在将结果传递给check_set 之前执行这两种方法,而我想要的是让check_set 决定应该调用哪个方法。
  • check_set从其他地方调用的吗?

标签: ruby


【解决方案1】:

这是一个使用 procs 的简单实现。 proc 仅在您对其执行call 时才会执行。

 def add_user_review(user_id, movie_id, set=:training)
    check_set set, proc { @training_data.add_user_review(user_id, movie_id) }, proc { @test_data.add_user_review(user_id, movie_id) }
  end

 def check_set(set, training_method, test_method)
   set == :training ? training_method.call() : test_method.call()
 end

【讨论】:

  • 谢谢!我试图通过调用 `Proc.new( { } ) 来做到这一点,但它失败了。感谢您向我展示正确的语法。
猜你喜欢
  • 2010-10-01
  • 2016-11-02
  • 1970-01-01
  • 2021-04-13
  • 2023-04-02
  • 2013-01-27
  • 1970-01-01
相关资源
最近更新 更多