[英]Ruby - Passing Blocks To Methods
我正在嘗試使用Highline gem進行Ruby密碼輸入,因為我有兩次用戶輸入密碼,我想消除我傳入的塊上的重復。例如,我的簡單版本現在做的是:
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的代碼可以正常工作,但這是一個更簡單,更簡短的解決方案:
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
這就是你應該怎么做,干凈簡單:
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)}
下面是一個示例,它將使用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
我不認為該語言支持這樣的結構。 我能看到以任何方式概括這一點的唯一方法是:
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
,你只需要在一個地方添加代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.