【问题标题】:Ruby Using Proc to store variables and retrieve them in a different functionRuby 使用 Proc 存储变量并在不同的函数中检索它们
【发布时间】:2021-05-04 13:59:16
【问题描述】:

我对 ruby​​ 还是很陌生,我试图理解 Procs,但我认为我误解了如何正确使用它们。我想在 proc 中存储一个动作并稍后检索存储的动作。这是我到目前为止所做的,这显然是不正确的并且不起作用。

我有以下方法:

def assign_proc_vars(action)
   Proc.new { |action| puts action }
end

那么我有:

def call_action_one
  assign_proc_vars "action1"
end

还有:

def call_action_two
   assign_proc_vars "action2"
end

然后在我的代码中:

call_action_two

最后,在一个新的方法中:

def handle_action
   action = assign_proc_vars
   curr_action = action.call
   if curr_action == "action2"

   elsif curr_action == "action1"

   end
end

【问题讨论】:

  • 我完全不明白你为什么要这样写代码,但最紧迫的错误是puts 返回nil。您确定要返回该值,而不是将其打印到 STDOUT?所以,从你的过程中删除单词puts
  • 换句话说,按照您目前的编写方式,curr_action 将始终等于 nil,而不是 "action1" 或其他。

标签: ruby proc


【解决方案1】:

Proc 的意义实际上有两个:

  1. 充当闭包,捕获当前 Binding 处的变量。
  2. 使您能够像传递变量一样传递命名函数。

无论 Proc 是否真的适合您的用例,您的代码都不会运行,因为:

  1. Kernel#puts 总是返回 nil。
  2. 您实际上并未传递 Proc 或将其分配给调用方法范围内可访问的变量。

在不尝试针对我不理解的用例进行重构的情况下,以下使用 Kernel#p 而不是 #puts 应该可以解决使用 Ruby 3.0.1 时代码的直接问题:

def handle_action action_proc, action
   case action_proc.call(action)
   when 'action1'; p 'Performing action one.'
   when 'action2'; p 'Performing action two.'
   else p %Q(Undefined action: '#{action}')
   end
end

# exercise each branch in your case statement
prc = Proc.new { p _1 }
['action1', 'action2', 'foo bar'].map { handle_action prc, _1 }

#=> 
["Performing action one.",
 "Performing action two.",
 "Undefined action: 'foo bar'"]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多