From: shannonskipper@... Date: 2018-06-04T23:03:09+00:00 Subject: [ruby-core:87395] [Ruby trunk Bug#14114] Add #step for Array, Enumerable, Enumerator Issue #14114 has been updated by shan (Shannon Skipper). Here's a pure Ruby implementation of Enumerable#step, just for fun: ~~~ ruby module Enumerable def step step = 1 raise TypeError, 'no implicit conversion of Object into Integer' unless step.respond_to? :to_int step_count = step.to_int raise TypeError, "can't convert #{step.class} to Integer (#{step.class}#to_int gives #{step_count.class})" unless step_count.instance_of? Integer raise TypeError, "step can't be 0" if step_count.zero? raise TypeError, "step can't be negative" if step_count.negative? if block_given? each_slice step_count do |this_step, *_rest| yield this_step end self else lazy_size = size.fdiv(step_count).ceil if size Enumerator.new lazy_size do |yielder| each_slice step_count do |this_step, *_rest| yielder << this_step end end end end end ~~~ A gist of the same, with some specs mostly borrowed from Range#step: https://gist.github.com/havenwood/501b7a7e57f512ec95cfcb7f9a44f0d0 ---------------------------------------- Bug #14114: Add #step for Array, Enumerable, Enumerator https://bugs.ruby-lang.org/issues/14114#change-72378 * Author: eike.rb (Eike Dierks) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- This must have been discussed before, please reassigned and close this one. I want to propose an extension to the ruby core api: - add #step(n) for Enumerable, Enumerator - coerce the step() api across all the api (see Numeric#step(by:n, to:m)) - extend to: #step((by:n, to:m, offset:k) We have Range#step, but #step is not yet defined for Array, Enumerable, Enumerator I believe, the semantics of #step, as defined in Range applies like well for Enumerable and Enumerator It should return every n'th element of the collection. As of 2.4 #step is not yet defined for Enumerable/Enumerator. But the semantics of this method is already well defined for Range. That same semantics should also apply for Enumerable#step(n) aka: pick every n'th element. Examples: ('a'..'z').step(2) => # ('a'..'z').to_a.step(2) NoMethodError: undefined method `step' ('a'..'z').to_enum.step(2) NoMethodError: undefined method `step' -- https://bugs.ruby-lang.org/ Unsubscribe: