Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-作为变量返回进程调用?_Ruby_Scope_Proc - Fatal编程技术网

Ruby-作为变量返回进程调用?

Ruby-作为变量返回进程调用?,ruby,scope,proc,Ruby,Scope,Proc,我正在尝试创建一个Ruby方法: 1.接受一个proc作为输入,该proc接受两个参数和 2.作为输出返回一个proc,该proc接受一个参数(另一个参数随第一个proc传入) 代码如下。我读到的关于Ruby如何处理functional scope的所有内容都表明我应该能够将proc.call作为变量返回,我不明白为什么会出现“意外返回”错误(在代码下面重现) (很明显,我是一个初学红宝石的人……我的经验主要是在JavaScript中,我认为在JavaScript中,做这类事情的机制更直观。)

我正在尝试创建一个Ruby方法: 1.接受一个proc作为输入,该proc接受两个参数和 2.作为输出返回一个proc,该proc接受一个参数(另一个参数随第一个proc传入)

代码如下。我读到的关于Ruby如何处理functional scope的所有内容都表明我应该能够将proc.call作为变量返回,我不明白为什么会出现“意外返回”错误(在代码下面重现)

(很明显,我是一个初学红宝石的人……我的经验主要是在JavaScript中,我认为在JavaScript中,做这类事情的机制更直观。)

--

def部分(proc1,val1) return Proc.new{| val2 | return proc1.call(val1,val2)} 结束 加法器=Proc.new{| a,b | a+b} 和五=部分(加法器,5) 求和5.打电话(10)#——预计15 #意外返回 #(答复):第13条:“部分封锁” #答:20:在"中"
在Ruby中,procs和lambda对返回的处理方式不同

proc被设计为在其他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中,procs和lambda对返回的处理方式不同

proc被设计为在其他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语法:

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已经有了一个方法,可以做到:

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
ing初始过程之前它应该期望的参数数,因此如果您将所需的参数作为“默认值”传递给它,它将工作得很奇怪:

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)

虽然我不知道它的名字,但Ruby已经有了一个方法,可以做到:

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
ing初始过程之前它应该期望的参数数,因此如果您将所需的参数作为“默认值”传递给它,它将工作得很奇怪:

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)

顺便说一下,本例中的所有返回语句都是多余的,可以在不改变代码含义的情况下删除。这很有效…谢谢!从您的评论和其他来源,我感觉到lambdas比proc更接近JavaScript函数(可以在不太关注范围的情况下传递)。顺便说一句,本例中的所有返回语句都是多余的,可以在不改变代码含义的情况下删除。这很有效……谢谢!从您的评论和其他来源中,我感觉到lambda比proc更接近JavaScript函数(可以在不太关注范围的情况下传递)。