Ruby – 将块传递给方法

我正在尝试使用Highline gem来执行Ruby密码input,并且由于我有用户input密码两次,所以我想消除我传入的块上的重复。例如,简单版本的I现在正在做的是:

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 

其中不幸的是不工作。 什么是正确的方法来做到这一点?

David的代码可以正常工作,但这是一个更简单和更短的解决scheme:

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

定义方法时,还可以使用&符号将variables分配给variables:

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

这是你应该怎么做,干净和简单:

 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) 
 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)} 

这里是一个以索引为前缀的方法,并用索引方法追加索引。

 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 

我不认为这种语言支持这样的结构。 我可以看到以任何方式概括这个唯一的方法是:

 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) } 

它并没有真正缩短代码,尽pipe它删除了一些重复内容 – 如果你不想把prompt.echo设置为false ,你只需要在一个地方添加代码。

Interesting Posts