Ruby 是否有命名和调用进程的特殊规则?
我在Hacker Rank上完成了一个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)”,但随后我得到了错
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)
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑