41 votes

Ruby - Passer des blocs aux méthodes

J'essaie de faire une saisie de mot de passe Ruby avec la fonction Le joyau de Highline et comme l'utilisateur doit saisir le mot de passe deux fois, j'aimerais éliminer la duplication sur les blocs que je transmets. Par exemple, une version simple de ce que je fais en ce moment est :

new_pass = ask("Enter your new password: ") { |prompt| prompt.echo = false }
verify_pass = ask("Enter again to verify: ") { |prompt| prompt.echo = false }

Et ce que j'aimerais changer, c'est quelque chose comme ça :

foo = Proc.new { |prompt| prompt.echo = false }
new_pass = ask("Enter your new password: ") foo
verify_pass = ask("Enter again to verify: ") foo

Ce qui malheureusement ne fonctionne pas. Quelle est la bonne façon de procéder ?

72voto

Adam Byrtek Points 5791

Le code de David fonctionnera parfaitement, mais cette solution est plus simple et plus courte :

foo = Proc.new { |prompt| prompt.echo = false }
new_pass = ask("Enter your new password: ", &foo)
verify_pass = ask("Enter again to verify: ", &foo)

Vous pouvez également utiliser une esperluette pour affecter un bloc à une variable lors de la définition d'une méthode :

def ask(msg, &block)
  puts block.inspect
end

13voto

Honza Points 2771

C'est comme ça qu'il faut faire, proprement et simplement :

def ask(question)
    yield(question)
end

proc = Proc.new { |question| puts question }
new_pass = ask("Enter your new password: ", &proc)
verify_pass = ask("Enter again to verify: ", &proc)

4voto

Cory Foy Points 5181

Cet article est probablement ce que vous recherchez.

4voto

David Nehme Points 11564
   foo = Proc.new { |prompt| prompt.echo = false }
   new_pass = ask("Enter your new password: ") {|x| foo.call(x)}
   verify_pass = ask("Enter again to verify: ") {|x| foo.call(x)}

2voto

jspooner Points 3963

Voici un exemple qui préfixera l'index avec la méthode yield et ajoutera l'index avec la méthode call.

class Array
  def alter_each!
    self.each_with_index do |n, i|
      self[i] = yield(n,i)
    end
  end
  def modify_each!(add_one = true, &block)
    self.each_with_index do |n, i|
      j = (add_one) ? (i + 1) : i
      self[i] = block.call(n,j)
    end
  end
end

a = ["dog", "cat", "cow"]

a.alter_each! do |n, i|
  "#{i}_#{n}"
end

a.modify_each! false do |n,i|
  "#{n}_#{i}"
end

puts a

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X