【问题标题】:How to wrap a method that yields in Ruby 1.9如何包装在 Ruby 1.9 中产生的方法
【发布时间】:2017-03-13 02:57:52
【问题描述】:

我有一个方法可以打印出一个编号列表,产生一个代码块来打印一个前缀。

arr = %w(a b c)

def print_lines(array)
  array.each_with_index do |item, index|
    prefix = yield index
    puts "#{prefix} #{item}"
  end
end

print_lines(arr) do |index|
  "(#{index})"
end

这会产生以下输出:

(0) a
(1) b
(2) c

现在我想将print_lines 包装在另一个方法中并调用它。

def print_lines_wrapped(array)
  puts 'print_lines_wrapped'
  print_lines(array)
end

print_lines_wrapped(arr) do |index|
  "(#{index})"
end

但是,这给了我一个LocalJumpError

test_yield.rb:5:in `block in print_lines': no block given (yield) (LocalJumpError)
  from test_yield.rb:4:in `each'
  from test_yield.rb:4:in `each_with_index'
  from test_yield.rb:4:in `print_lines'
  from test_yield.rb:16:in `print_lines_wrapped'
  from test_yield.rb:19:in `<main>'

为什么我会收到LocalJumpError?

我怎样才能实现print_lines_wrapped 这样我就可以这样称呼它:

print_lines_wrapped(arr) do |index|
  "(#{index})"
end

并得到以下输出:

print_lines_wrapped
(0) a
(1) b
(2) c

?

【问题讨论】:

标签: ruby yield


【解决方案1】:

您的包装方法还必须接受一个块并将其传递给被包装的方法。没有隐式传递块:

def print_lines_wrapped(array, &block)
  puts 'print_lines_wrapped'
  print_lines(array, &block)
end

例子:

def asdf(&block) puts yield(2) end
def qwer(&block)
  puts "I am going to call asdf"
  asdf &block
end

asdf { |x| x * 3 }
6
=> nil
qwer { |x| x * 5 }
I am going to call asdf
10
=> nil

&amp; 运算符尽可能将其操作数转换为块

 qwer &Proc.new { |x| x * 2 }
 I am going to call asdf
 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2012-03-30
    相关资源
    最近更新 更多