我完成了一次关于hacker Rank的Ruby挑战,但是我不明白为什么能够使用其保存名称的缩写版本调用Proc。
proc定义为:
proc_sum_array = proc {|arr| arr.reduce(:+)}
但是它被这样称呼:
proc_sum.call(my_array)
...没有名称proc_sum _array
的“ _array”部分这让我感到困惑,所以我将“ 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_array显得很重要。
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。为什么不是这种情况?
答案 0 :(得分:3)
这称为参数。参数有点像您在子例程的定义中留下的“孔”。调用该子例程时,您用自变量“填充”了该“孔”。 (这称为“传递参数”。)
这里:
def square_of_sum (my_array, proc_square, proc_sum)
# ↑↑↑↑↑↑↑↑
您定义了一个带有两个参数的名为square_of_sum
的方法。这些参数中的第三个称为proc_sum
。
这里:
puts square_of_sum(my_array, proc_square_number, proc_sum_array)
# ↑↑↑↑↑↑↑↑↑↑↑↑↑↑
您将由局部变量proc_sum_array
引用的对象作为调用square_of_sum
方法的参数传递。
这意味着在方法主体内部,您作为参数传递的对象将绑定到参数(这称为将参数绑定到参数),即您在proc_sum
主体内取消引用参数square_of_sum
时,它将求值任何作为参数传递的对象。
请注意,proc_sum_array
是局部变量(您知道它是局部变量,因为1)它以小写字母开头,而2)它不是方法)。局部变量称为“局部”变量,因为它们在定义它们的作用域内是局部的。在这种特殊情况下,proc_sum_array
在脚本作用域内是局部的,这意味着它甚至不存在于方法作用域内square_of_sum
中的所有内容,因此您根本完全都无法引用它!
还要注意,这与square_of_sum
的所有其他参数完全相同:您将作为proc_square
参数的参数传递的对象称为proc_square
,而不是为proc_square_number
。
答案 1 :(得分:1)
好的,现在您链接了实际示例,我可以回答您。
之所以将其称为proc_sum_array
而不是square_of_sum
的原因是因为这是传递给a = 2
def sqr(b)
b * b
end
sqr(a)
方法的参数的命名方式。这根本不是魔术。类似于:
a
您看到的是,您定义了b
局部变量,但是您在sqr
方法中将其作为b
参数传递,因此在此方法内部将其称为{{1} }。