Есть ли способ сделать рекурсию с аргументами ключевого слова в ruby ​​​​2 без повторного указания каждого аргумента?

Предположим, у меня есть заголовок метода:

def meth(a: val1, b: val2, c: val3)

и внутри meth я хочу сделать рекурсивный вызов и передать все те же аргументы, но изменить один..

может быть, что-то похожее на это, семантически:

meth(_args_.merge(c: newval))

Это возможно?


person NullVoxPopuli    schedule 20.01.2014    source источник
comment
Не могли бы вы сделать аргумент хешем, объединить его с хешем, содержащим значения по умолчанию, сделать то, что вам нужно сделать в meth, а затем изменить один ключ для рекурсии? Я так понимаю, что-то подобное было сделано до того, как стали поддерживаться именованные параметры.   -  person Cary Swoveland    schedule 21.01.2014


Ответы (1)


Не уверен, что для этого существует встроенный метод, но, очевидно, это возможно с использованием local_variables и некоторого eval-fu:

def foo(bar: :baz)
  Hash[local_variables.map { |k| [k, eval("#{k}")] }]
end

foo # {:bar=>:baz}

Связанный вопрос:

Как динамически создать локальную переменную в Ruby?< /а>

person Denis de Bernardy    schedule 20.01.2014
comment
local_variables аккуратный. Хотя у этого метода довольно много неформальных аргументов, поэтому local_variables довольно большой. Может быть, есть более чистый способ передать только то, что есть в заголовке метода? Я полагаю, что можно было бы сделать method(:meth).parameters.map{|a| a.last} и отфильтровать local_variables на основе этого результата. В этот момент это будет примерно так же долго, как указание всех параметров. смешной. Тем не менее приятно знать, что это возможно. - person NullVoxPopuli; 21.01.2014
comment
Null, если бы вы это сделали, вместо этого вы могли бы использовать method(__method__).parameters.... - person Cary Swoveland; 21.01.2014