43

Highline gemを使用して Ruby のパスワード入力を行おうとしていますが、ユーザーにパスワードを 2 回入力してもらうため、渡すブロックの重複を排除したいと考えています。今やっているのは:

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

そして、私がそれを変更したいのは、次のようなものです。

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

残念ながらこれは機能しません。これを行う正しい方法は何ですか?

4

5 に答える 5

74

David によるコードは問題なく動作しますが、これはより簡単で短い解決策です。

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

メソッドを定義するときにアンパサンドを使用してブロックを変数に割り当てることもできます。

def ask(msg, &block)
  puts block.inspect
end
于 2008-11-11T18:04:05.633 に答える
13

これは、クリーンでシンプルな方法です。

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)
于 2008-11-11T19:40:54.660 に答える
4
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)}
于 2008-11-11T17:47:14.700 に答える
2

これは、yield メソッドをインデックスの前に置き、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
于 2010-05-21T17:48:17.180 に答える
-2

この言語はこのような構成をサポートしていないと思います。これを何らかの方法で一般化するために私が見ることができる唯一の方法は次のとおりです。

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

コードを実際に短縮するわけではありませんが、重複はなくなります。設定以上のことをしprompt.echoたいfalse場合は、1か所にコードを追加するだけで済みます。

于 2008-11-11T17:46:06.950 に答える