产生或返回 Enumerator 的 ruby​​ 方法

发布于 2024-12-01 04:30:11 字数 504 浏览 1 评论 0原文

在最新版本的 Ruby 中,Enumerable 中的许多方法在没有块的情况下调用时都会返回一个 Enumerator

[1,2,3,4].map 
#=> #<Enumerator: [1, 2, 3, 4]:map> 
[1,2,3,4].map { |x| x*2 }
#=> [2, 4, 6, 8] 

我想在我自己的方法中做同样的事情,如下所示:

class Array
  def double(&block)
    # ???
  end
end

arr = [1,2,3,4]

puts "with block: yielding directly"
arr.double { |x| p x } 

puts "without block: returning Enumerator"
enum = arr.double
enum.each { |x| p x }

in recent versions of Ruby, many methods in Enumerable return an Enumerator when they are called without a block:

[1,2,3,4].map 
#=> #<Enumerator: [1, 2, 3, 4]:map> 
[1,2,3,4].map { |x| x*2 }
#=> [2, 4, 6, 8] 

I want do do the same thing in my own methods like so:

class Array
  def double(&block)
    # ???
  end
end

arr = [1,2,3,4]

puts "with block: yielding directly"
arr.double { |x| p x } 

puts "without block: returning Enumerator"
enum = arr.double
enum.each { |x| p x }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

夜夜流光相皎洁 2024-12-08 04:30:11

核心库插入一个守卫return to_enum(:name_of_this_method, arg1, arg2, ..., argn) except block_given?。在你的情况下:

class Array
  def double
    return to_enum(:double) unless block_given?
    each { |x| yield 2*x }
  end
end

>> [1, 2, 3].double { |x| puts(x) }
2
4
6 
>> ys = [1, 2, 3].double.select { |x| x > 3 } 
#=> [4, 6]

The core libraries insert a guard return to_enum(:name_of_this_method, arg1, arg2, ..., argn) unless block_given?. In your case:

class Array
  def double
    return to_enum(:double) unless block_given?
    each { |x| yield 2*x }
  end
end

>> [1, 2, 3].double { |x| puts(x) }
2
4
6 
>> ys = [1, 2, 3].double.select { |x| x > 3 } 
#=> [4, 6]
白芷 2024-12-08 04:30:11

使用 Enumerator#new

class Array
  def double(&block)
    Enumerator.new do |y| 
      each do |x| 
        y.yield x*2 
      end 
    end.each(&block)
  end
end

use Enumerator#new:

class Array
  def double(&block)
    Enumerator.new do |y| 
      each do |x| 
        y.yield x*2 
      end 
    end.each(&block)
  end
end
勿忘初心 2024-12-08 04:30:11

另一种方法可能是:

class Array
    def double(&block)
        map {|y| y*2 }.each(&block)
    end
 end

Another approach might be:

class Array
    def double(&block)
        map {|y| y*2 }.each(&block)
    end
 end
不必你懂 2024-12-08 04:30:11

对我来说最简单的方法

class Array
  def iter
      @lam = lambda {|e| puts e*3}
      each &@lam
  end
end

array = [1,2,3,4,5,6,7]
array.iter

=>
3
6
9
12
15
18
21

easiest way for me

class Array
  def iter
      @lam = lambda {|e| puts e*3}
      each &@lam
  end
end

array = [1,2,3,4,5,6,7]
array.iter

=>
3
6
9
12
15
18
21

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文