我想知道是否有类似于范围的内容,但不是整数,而是有序夫妻(x,y)。我想知道是否有一种简单的方法可以做这样的事情:
((1,2)..(5,6)).each {|tmp| puts tmp} #=> (1,2) (3,4) (5,6)
编辑:也许我的问题并非100%明确:)我会尝试以不同的方式提问。
如果我有这些夫妇:(3,4)和(5,6)我正在寻找一种方法来帮助我产生:
(3,4), (4,5), (5,6)
如果我必须更好地开除它:如果夫妻是(x,y) - >
(x0,y0), ((x0+1),(y0+1)), ((x0+2), (y0+2)) and so on .
答案 0 :(得分:2)
您可以将数组用作Range元素,例如:
> t = [1, 2]..[3, 4]
=> [1, 2]..[3, 4]
但是,它无法迭代,因为Array
类缺少succ
方法。
> t.each {|tmp| puts tmp}
TypeError: can't iterate from Array
from (irb):5:in `each'
from (irb):5
from D:/Programmes/Ruby/bin/irb:12:in `<main>'
因此,如果您想允许使用数组进行迭代,请定义一个符合您需要的Array#succ
方法:
class Array
def succ
self.map {|elem| elem + 1 }
end
end
给你:
> t = [1, 2]..[3, 4]
=> [1, 2]..[3, 4]
> t.each {|tmp| p tmp}
[1, 2]
[2, 3]
[3, 4]
=> [1, 2]..[3, 4]
答案 1 :(得分:1)
1.9.3-p327 :001 > (1..6).each_slice(2).to_a
=> [[1, 2], [3, 4], [5, 6]]
答案 2 :(得分:1)
Ruby是一种面向对象的语言。所以,如果你想对“有序情侣对象”做一些事情,那么你需要......好吧......一个OrderedCouple
对象。
class OrderedCouple < Struct.new(:x, :y)
end
OrderedCouple.new(3, 4)
# => #<struct OrderedCouple x=3, y=4>
呃,看起来很难看:
class OrderedCouple
def to_s; "(#{x}, #{y})" end
alias_method :inspect, :to_s
class << self; alias_method :[], :new end
end
OrderedCouple[3, 4]
# => (3, 4)
Range
用于两件事:检查包含和迭代。为了将对象用作Range
的起点和终点,它必须回复<=>
。如果您想迭代Range
,那么起始对象必须回复succ
:
class OrderedCouple
include Comparable
def <=>(other)
to_a <=> other.to_a
end
def to_a; [x, y] end
def succ
self.class[x.succ, y.succ]
end
end
puts *OrderedCouple[1, 2]..OrderedCouple[5, 6]
# (1, 2)
# (2, 3)
# (3, 4)
# (4, 5)
# (5, 6)
答案 3 :(得分:1)
试试这个,
def tuples(x, y)
return enum_for(:tuples, x, y) unless block_given?
(0..Float::INFINITY).each { |i| yield [x + i, y + i] }
end
然后,
tuples(1,7).take(4)
# or
tuples(1,7).take_while { |x, y| x <= 3 && y <= 9 }
两者都返回
[[1, 7], [2, 8], [3, 9]]