比如说
def get_next current
a = %w[a b c d e f]
# .......(实现通过current找到下一个元素)
end
get_next('b') # 怎么才能得到c
解决办法:请移步到 2 楼,21 楼,27 楼!
def get_next(current)
a = %w[a b c d e f]
a[a.index(current)+1]
end
get_next('b') #=> "c"
应用场景是啥?大部分需要看上一个/下一个元素的话 each_cons(2)
就解决了...
而且有重复元素怎么办?a = %w[a b a c]
的话 get_next('a')
总是返回 'b'
...
Enumerator.next 好像不能直接用,按 2 楼的方法吧:
class Array
def get_next_of(a)
self[self.index(a)+1]
end
end
a=[3,2,'1' ]
p a.get_next_of(2) #=> "1"
class NilClass
def + n
0
end
end
class Array
def get_next_of(i)
self[ self.index(i)+1 ]
end
end
a=[3,2,'1' ]
p a.get_next_of(2) #=> "1"
p a.get_next_of(-2) #=> 3
def get_next x
Hash[%w[a b c d e f].each_cons(2).to_a][x]
end
你有一个数组和里面的一个元素,想找下一个,可能你的代码是这个样子的?
a.each do |e|
next_e = get_next(e)
...
end
还不如改改思路,变成这样:
a.each_cons 2 do |e, next_e|
...
end
a.each_cons 2 do |e, next_e|
...
end
如果我用这种方法的时候我不知道用什么语法(return?break?)跳出循环,并且要返回我要得到的值?
这里 break
就可以跳出循环
P.S. 所有 block/lambda 都能 break
的,例如下面这两个:
pow = -> x {
break 1 if x == 0 # 是不是和 return 1 很像?
x * pow.(x - 1)
}
pow.(5)
(1..(1/0.0)).inject do |product, x|
break product if x > 5
product *= x
end
需要再加入找不到或者边界情况,但思路是这样
def find_next(array, element) array.shift == element ? array.shift : find_next(array, element) end
没有重复的话随便怎么搞都可以啦,给个正则的方式~
def find_next(a,e)
a.join =~ /#{e}(.)/ ? $1 : e
end
#28 楼 @simlegate 上面的是针对单字符的情况。所以如果用正则来做的话通用性会差些,比如你的元素中如果没有“-",你可以:
def find_next(a,e)
a.join('-') =~ /#{e}-([^-]*)/ ? $1 : e
end
如果不懂正则那就只有学一下或是用其它方法啦~