Search code examples
rubyhighline

Ruby - Passing Blocks To Methods


I'm trying to do Ruby password input with the Highline gem and since I have the user input the password twice, I'd like to eliminate the duplication on the blocks I'm passing in. For example, a simple version of what I'm doing right now is:

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

And what I'd like to change it to is something like this:

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

Which unfortunately doesn't work. What's the correct way to do this?


Solution

  • The code by David will work fine, but this is an easier and shorter solution:

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

    You can also use an ampersand to assign a block to a variable when defining a method:

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