Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.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 on rails ruby中传递&:method和:method作为函数参数的区别_Ruby On Rails_Ruby_Metaprogramming_Function Pointers_Symbols - Fatal编程技术网

Ruby on rails ruby中传递&:method和:method作为函数参数的区别

Ruby on rails ruby中传递&:method和:method作为函数参数的区别,ruby-on-rails,ruby,metaprogramming,function-pointers,symbols,Ruby On Rails,Ruby,Metaprogramming,Function Pointers,Symbols,我正在努力理解何时使用符号和来传递表示方法的函数。例如,如果我想计算范围1..10的和,我可以执行以下操作: 1..10.注入:+ 这最初让我相信,如果你想传递一个符号来定义一个在函数中神奇地使用的方法,你会将函数名作为一个符号传递。但我在rails中看到了类似的东西: 总计=产品。查找产品列表。总和和:价格 如果我理解正确,&:price与调用:price.to_proc相同。我不理解上面的工作原理。在方法调用的实际参数列表中,&object是内置语法,它将 使用object.to_Proc将

我正在努力理解何时使用符号和来传递表示方法的函数。例如,如果我想计算范围1..10的和,我可以执行以下操作:

1..10.注入:+

这最初让我相信,如果你想传递一个符号来定义一个在函数中神奇地使用的方法,你会将函数名作为一个符号传递。但我在rails中看到了类似的东西:

总计=产品。查找产品列表。总和和:价格


如果我理解正确,&:price与调用:price.to_proc相同。我不理解上面的工作原理。

在方法调用的实际参数列表中,&object是内置语法,它将

使用object.to_Proc将对象转换为进程 将Proc作为方法的块参数传递 Symbolto_proc将符号转换为proc{| obj | obj.send:the_symbol}。只要对象响应于_proc方法并返回一个proc,就可以使用这个语法

abc=aha~ 类别[2,4,6] 1..10.inject:+显示inject接受符号作为参数。符号的使用方式是特定于方法的行为。在inject的特例中,它与1..10具有相同的效果。这只是一个简单、正常的参数,其效果取决于接受符号作为参数的方法的实现

请注意,ActiveSupport中的sum接受一个带有单个参数的块,该块具有将原始序列中的值映射到新值的效果,并计算它们的总和,因此

总计=产品。查找产品列表。总和和:价格 相当于

总计=Product.findproduct_list.sum&proc{| p | p.send:price} 或者你可以写信 总计=Product.findproduct_list.sum{p | p.price} 其返回值与以下值相同,但不会生成中间临时数组:

总计=Product.findproduct_list.map{| p | p.price}.sum
在方法调用的实际参数列表中,&object是内置语法,它将

使用object.to_Proc将对象转换为进程 将Proc作为方法的块参数传递 Symbolto_proc将符号转换为proc{| obj | obj.send:the_symbol}。只要对象响应于_proc方法并返回一个proc,就可以使用这个语法

abc=aha~ 类别[2,4,6] 1..10.inject:+显示inject接受符号作为参数。符号的使用方式是特定于方法的行为。在inject的特例中,它与1..10具有相同的效果。这只是一个简单、正常的参数,其效果取决于接受符号作为参数的方法的实现

请注意,ActiveSupport中的sum接受一个带有单个参数的块,该块具有将原始序列中的值映射到新值的效果,并计算它们的总和,因此

总计=产品。查找产品列表。总和和:价格 相当于

总计=Product.findproduct_list.sum&proc{| p | p.send:price} 或者你可以写信 总计=Product.findproduct_list.sum{p | p.price} 其返回值与以下值相同,但不会生成中间临时数组:

总计=Product.findproduct_list.map{| p | p.price}.sum
这与EnumerableInject无关,我只是将其作为一个示例。在您的示例中,:+的效果严格取决于注入,而&:price则与注入无关。感谢您为我澄清这一点。这与EnumerableInject无关,我只是把它作为一个例子。在你的例子中,+的效果严格依赖于注入,而&:price则不依赖于注入。感谢你为我澄清了这一点。我想,&是to_proc的缩写,而不是to_sym,我错了吗?price.to_proc与sum如何相互作用?我的意思是,我会假设它以某种方式转换为product.price,并对这些价格进行求和。我想&是to_proc的缩写,而不是to_sym,我错了吗?price.to_proc如何与sum交互?我的意思是,我会假设它以某种方式转换为产品价格,并将这些价格相加。