Ruby - 返回 proc.Call 作为变量



我正在尝试创建一个Ruby方法,该方法:1. 接受接受两个参数的 proc 作为输入,并且2. 返回一个接受一个参数的 proc 作为输出(另一个参数与第一个进程一起传入)。

下面的代码。我读到的关于 Ruby 如何处理函数作用域的所有内容都表明我应该能够将 proc.call 作为变量返回,我不明白为什么我会收到"意外返回"错误(在代码下方复制)

(我显然是一个初级的Rubyist...我的经验主要是在 JavaScript 中,我认为做这种事情的机制要直观得多。

--

def partial (proc1, val1)
  return Proc.new {|val2| return proc1.call(val1,val2)}
end
adder = Proc.new {|a,b| a + b}
sum_five = partial(adder,5)
sum_five.call(10) # -- expecting 15
# unexpected return
# (repl):13:in `block in partial'
# (repl):20:in `<main>'

在 Ruby 中,procs 和 lambda 处理返回的方式不同。

procs 被设计为在其他 Ruby 控制结构中工作,因此在这种情况下,返回来自控制结构。Lambda 更像是独立方法,因此从 lambda 返回返回。您收到错误,因为 proc 没有要从中返回的上下文。

试试这个:

def partial (proc1, val1)
  return lambda {|val2| return proc1.call(val1,val2)}
end
adder = Proc.new {|a,b| a + b}
sum_five = partial(adder,5)
puts sum_five.call(10) # -- expecting 15

更短/更干净的 ruby 语法:

def composer(proc1, val1)
  -> (val2) { proc1.call(val1, val2) }
end
adder = -> (a,b) { a + b }
sum_five = composer(adder, 5)
sum_five.call(10)
虽然

我不明白它的名字,但 Ruby 已经有一个方法,Proc#curry ,可以做到这一点:

adder = Proc.new {|a,b| a + b}
sum_five = adder.curry.call(5)
sum_five.call(10) # => 15
sum_five.call(2) # => 7

请注意,因为curry需要一个可选参数,这是它在call初始进程之前应该期望的参数数量,所以如果你将你想要的参数作为"默认"传递给它,它会很奇怪地工作:

adder = Proc.new {|a,b| a + b}
sum_five = adder.curry(5) # NOTE: This is incorrect
sum_five.call(1) # => returns a Proc
sum_five[1][2][3][4][5] # => 3 (the first 2 arguments got passed, the rest ignored)

相关内容

  • 没有找到相关文章

最新更新