簡體   English   中英

Ruby - 將塊傳遞給方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM