Ruby: Como obter o valor padrão dos argumentos proc opcionais

9

Digamos que eu tenha um proc / lambda / block / method / etc da seguinte forma:

2.1.2 :075 > procedure = Proc.new { |a, b=2, *c, &d| 42 }
 => #<Proc:0x000000031fcd10@(irb):75> 

Eu sei que posso descobrir os nomes dos parâmetros com:

2.1.2 :080 > procedure.parameters
 => [[:opt, :a], [:opt, :b], [:rest, :c], [:block, :d]]

Mas como faço para obter o valor que determinado parâmetro opcional assumiria se não fosse fornecido?

PS: sim. Eu sei que isso foi perguntado / respondido antes here , mas a solução anterior requer o uso da merb gem, que na verdade é um pouco enganosa. merb dependeu da methopara gem (a menos que você esteja em JRuby ou MRI, o que eu não sou), o que por si só forneceu o recurso no momento em que a pergunta foi respondida.

Infelizmente, atualmente, methopara parece ser o abandonware. Além disso, ele só suportou o Ruby 1.9 (e nem mesmo a última versão dele), então estou procurando uma solução que funcione para as versões atuais do Ruby.

    
por mikev 23.12.2014 в 10:09
fonte

1 resposta

2

Supondo que o proc / lambda foi definido em um arquivo, você pode usar o método source_location para encontrar a localização desse arquivo e o número da linha em que ele foi definido.

2.2.0 (main):0 > OH_MY_PROC.source_location
=> [
  [0] "sandbox/proc.rb",
  [1] 1
]

Com alguma ajuda de File.readlines , podemos fazer um método curto que, quando passado, um proc / lambda pode cuspir a linha de origem na qual ele foi definido.

def view_def proc_lambda
  location = proc_lambda.source_location
  File.readlines(location[0])[location[1]-1]
end

Em ação, parece algo como isto

2.2.0 (main):0 > view_def OH_MY_PROC
=> "OH_MY_PROC = Proc.new { |a, b=2, *c, &d| 42 }\n"
2.2.0 (main):0 > view_def OH_MY_LAMBDA
=> "OH_MY_LAMBDA = ->(a, b=2, *c, &d) { 42 }\n"

Se você quiser fazer o mesmo para os métodos, isso se torna um pouco mais complicado. Nesse caso, recomendo que você leia este post do blog do Pragmatic Studio: "Ver código-fonte" em Métodos Ruby

    
por brownmike 29.01.2015 / 07:18
fonte