Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 - Fatal编程技术网

Ruby 是否有命名和调用进程的特殊规则?

Ruby 是否有命名和调用进程的特殊规则?,ruby,Ruby,我在Hacker Rank上完成了一个Ruby挑战,但我不明白为什么一个进程可以用它保存的名称的缩写版本来调用 该过程定义为: proc_sum_array = proc {|arr| arr.reduce(:+)} 但它的名字是这样的: proc_sum.call(my_array) …没有名称proc_sum_数组的“_数组”部分 这让我很困惑,所以我将“proc_sum.call(my_array)”更改为“proc_sum_array.call(my_array)”,但随后我得到了错

我在Hacker Rank上完成了一个Ruby挑战,但我不明白为什么一个进程可以用它保存的名称的缩写版本来调用

该过程定义为:

proc_sum_array = proc {|arr| arr.reduce(:+)}
但它的名字是这样的:

proc_sum.call(my_array)
…没有名称proc_sum_数组的“_数组”部分

这让我很困惑,所以我将“proc_sum.call(my_array)”更改为“proc_sum_array.call(my_array)”,但随后我得到了错误:

undefined local variable or method `proc_sum_array' for main:Object (NameError) 
Did you mean?  proc_sum
因此,将proc称为proc_sum而不是proc_sum_数组似乎很重要

def square_of_sum (my_array, proc_square, proc_sum)
    sum = proc_sum.call(my_array) # QUESTION: Why is this proc_sum, and not proc_sum_array ?
    proc_square.call(sum)
end

proc_square_number = proc {|x| x ** 2}
proc_sum_array     = proc {|arr| arr.reduce(:+)} # This is where the proc is defined.
my_array = gets.split().map(&:to_i)

puts square_of_sum(my_array, proc_square_number, proc_sum_array)

我希望proc_sum_arry将被称为proc_sum_array.call。为什么不是这样呢?

好的,现在当您链接实际示例时,我可以回答您。 之所以将它称为
proc\u sum
,而不是
proc\u sum\u数组
,是因为它是如何命名传入
square\u of_sum
方法的参数。这一点也不神奇。它类似于:

a = 2
def sqr(b)
  b * b
end
sqr(a)

您知道,您定义了
a
局部变量,但在
sqr
方法中,您将其作为
b
参数传递,因此在该方法中,您将其称为
b
好的,现在,当您链接实际示例时,我可以回答您。 之所以将它称为
proc\u sum
,而不是
proc\u sum\u数组
,是因为它是如何命名传入
square\u of_sum
方法的参数。这一点也不神奇。它类似于:

a = 2
def sqr(b)
  b * b
end
sqr(a)
您可以看到,您定义了
a
局部变量,但在
sqr
方法中将其作为
b
参数传递,因此在该方法中,您将其称为
b
,这称为参数。一个参数有点像你在子程序定义中留下的一个“洞”。当您调用该子例程时,您将用一个参数“填充”该“孔”。(这称为“传递参数”。)

在这里:

您可以使用两个参数定义一个名为
square\u of_sum
的方法。这些参数中的第三个称为
proc\u sum

在这里:

将局部变量
proc\u sum\u数组引用的对象作为参数传递给调用
square\u of\u sum
方法

这意味着,在方法体中,作为参数传递的对象将绑定到参数(这称为将参数绑定到参数),即,当您在
square\u of_sum
体中取消引用参数
proc\u sum
时,它将计算作为参数传递的任何对象

请注意,
proc\u sum\u array
是一个局部变量(您知道它是一个局部变量,因为1)它以小写字母开头,2)它不是一个方法)。局部变量被称为“局部”变量,因为它们在定义它们的范围内是局部的。在这种特殊情况下,
proc\u sum\u数组
是脚本范围的本地数组,这意味着它甚至不存在于
square\u of\u sum
的方法范围内,因此您根本无法引用它

还请注意,这与求和的
平方
的每个其他参数完全相同:您将作为
proc\u square
参数传递的对象称为
proc\u square
,而不是
proc\u square\u number
这称为参数。一个参数有点像你在子程序定义中留下的一个“洞”。当您调用该子例程时,您将用一个参数“填充”该“孔”。(这称为“传递参数”。)

在这里:

您可以使用两个参数定义一个名为
square\u of_sum
的方法。这些参数中的第三个称为
proc\u sum

在这里:

将局部变量
proc\u sum\u数组引用的对象作为参数传递给调用
square\u of\u sum
方法

这意味着,在方法体中,作为参数传递的对象将绑定到参数(这称为将参数绑定到参数),即,当您在
square\u of_sum
体中取消引用参数
proc\u sum
时,它将计算作为参数传递的任何对象

请注意,
proc\u sum\u array
是一个局部变量(您知道它是一个局部变量,因为1)它以小写字母开头,2)它不是一个方法)。局部变量被称为“局部”变量,因为它们在定义它们的范围内是局部的。在这种特殊情况下,
proc\u sum\u数组
是脚本范围的本地数组,这意味着它甚至不存在于
square\u of\u sum
的方法范围内,因此您根本无法引用它


还要注意,这与sum的
square\u
的每个其他参数完全相同:您将作为
proc\u square
参数传递的对象称为
proc\u square
,而不是
proc\u square\u number
,这可能是特定于您的情况,您可能在某个地方有
proc\u sum
方法。这不是一般规则。试着追踪这个
proc\u sum
方法的来源,然后你就会知道它的返回值来自哪里,以及它是如何(如果有的话)与
proc\u sum\u数组
局部变量链接的。很有趣,谢谢你的帮助,Marek。以下是迎接挑战的方法。你是说Hackerrank在挑战中隐藏了一个不可见的地方?对不起,我的评论是错误的,我没有注意到这个
proc\u sum
仅仅是你传递给
square\u of u sum
方法的参数名。有趣的是,OP在课程中走了这么远,从来没有遇到过参数的概念。这可能是特定于你的情况,你可能在某个地方有
proc\u sum
方法。这不是一般的规则,试着找出
puts square_of_sum(my_array, proc_square_number, proc_sum_array)
#                                                ↑↑↑↑↑↑↑↑↑↑↑↑↑↑