命名和调用Procs是否有特殊规则?

时间:2018-12-20 12:45:46

标签: ruby

我完成了一次关于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。为什么不是这种情况?

2 个答案:

答案 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} }。