【发布时间】:2013-11-29 13:35:26
【问题描述】:
还有其他写'a'.next.next的方法吗?我找遍了,好像没找到。
我尝试将.next 相乘,但我不断收到错误。
【问题讨论】:
-
我刚刚尝试使用
.next.next,它成功了——你遇到了什么错误? -
抱歉给您带来了困惑。 .next.next 工作正常。我只需要知道是否有另一种写法,比如我是否需要使用接下来的 20 次。
还有其他写'a'.next.next的方法吗?我找遍了,好像没找到。
我尝试将.next 相乘,但我不断收到错误。
【问题讨论】:
.next.next,它成功了——你遇到了什么错误?
嗯,这可能在这里的情况下不是一个好主意,但如果你想链接一个方法 n 次一般,你可以做一些事情像这样:
2.times.inject('a') { |s| s.next }
# => 'c'
20.times.inject('a') { |s| s.next }
# => 'u'
这从值'a' 开始,运行一个调用next 的块,然后将每个连续的结果反馈到块中。
不管怎样,猴子补丁String 可以用于琐碎的脚本,但我个人会尝试先寻找其他解决方案,比如在你的类/模块中添加一个实用函数:
def repeat_next(str, n = 1)
n.times.inject(str) { |s| s.next }
end
可能存在针对您的特定问题的快捷方式(a.ord + 2).chr,尽管它是not the same thing。
【讨论】:
.inject 解决方案。可惜2.times.inject('a', &:next)不起作用。
times 生成的索引传递给String#next,这是一个错误,因为String#next 不接受任何参数。也就是你写的相当于2.times.inject('a') { |s, i| s.next i }。
您可以像这样重新定义String.next:
class String
alias_method :next1, :next
def next(n = 1)
str = self
for i in 1..n
str = str.next1
end
str
end
end
puts 'a'.next
puts 'a'.next(2)
puts 'a'.next(20)
【讨论】:
inject 的答案。随着猴子补丁的进行,这是更合理的一面,但我的经验是,如果您希望代码能够长寿,那么猴子补丁核心类并不是一个可以很好地老化的解决方案。
您可以在 ruby 中对 String 类进行猴子修补,以添加一个方法来为您执行此操作:
class String
def get_nth_char(n)
current = self
while n > 0 do
current = current.next
n = n - 1
end
current
end
end
所以你可以这样做'a'.get_nth_char(2) # => 'c'
【讨论】:
如果您正在寻找更简洁的方法,您可以使用:('a'.ord + 2).chr。这会将“a”转换为数字表示(使用“ord”方法),将其增加 2,然后将其转换回字符表示(使用“chr”)。
【讨论】: