Существуют ли специальные правила для именования и вызова Procs? - PullRequest
0 голосов
/ 20 декабря 2018

Я выполнил вызов Ruby для Hacker Rank, но я не понимаю, почему Proc может вызываться с сокращенной версией его сохраненного имени.

Proc был определен как:

proc_sum_array = proc {|arr| arr.reduce(:+)}

Но это называлось так:

proc_sum.call(my_array)

... без части "_array" имени proc_sum _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 голосов
/ 20 декабря 2018

Это называется параметр .Параметр похож на «дыру», которую вы оставляете в определении подпрограммы.Когда вы вызываете эту подпрограмму, вы «заполняете» эту «дыру» аргументом .(Это называется «передачей аргумента».)

Здесь:

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.

0 голосов
/ 20 декабря 2018

Хорошо, теперь, когда вы привели пример, я могу вам ответить.Причина, по которой он упоминается как proc_sum, а не proc_sum_array, заключается в том, что именно так называется аргумент, передаваемый в метод square_of_sum.Это совсем не волшебно.Это похоже на:

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

Видите ли, вы определяете a локальную переменную, но вы передаете ее как b аргумент в методе sqr, поэтому внутри этого метода вы ссылаетесь на него какb.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...