【问题标题】:Ruby next multipleRuby 下一个倍数
【发布时间】:2013-11-29 13:35:26
【问题描述】:

还有其他写'a'.next.next的方法吗?我找遍了,好像没找到。

我尝试将.next 相乘,但我不断收到错误。

【问题讨论】:

  • 我刚刚尝试使用.next.next,它成功了——你遇到了什么错误?
  • 抱歉给您带来了困惑。 .next.next 工作正常。我只需要知道是否有另一种写法,比如我是否需要使用接下来的 20 次。

标签: ruby loops next


【解决方案1】:

嗯,这可能在这里的情况下不是一个好主意,但如果你想链接一个方法 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)不起作用。
  • @jaeheung 我完全同意。不幸的是,它失败了,因为它试图将times 生成的索引传递给String#next,这是一个错误,因为String#next 不接受任何参数。也就是你写的相当于2.times.inject('a') { |s, i| s.next i }
【解决方案2】:

您可以像这样重新定义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 的答案。随着猴子补丁的进行,这是更合理的一面,但我的经验是,如果您希望代码能够长寿,那么猴子补丁核心类并不是一个可以很好地老化的解决方案。
【解决方案3】:

您可以在 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'

【讨论】:

  • 当您提供这样的答案时,有助于显示使用情况。
【解决方案4】:

如果您正在寻找更简洁的方法,您可以使用:('a'.ord + 2).chr。这会将“a”转换为数字表示(使用“ord”方法),将其增加 2,然后将其转换回字符表示(使用“chr”)。

【讨论】:

  • 行为不一样。 'z'.next 返回“aa”,而 ('z'.ord + 2).chr 返回“|”。
  • 这是有问题的。不过,我现在要留下答案,因为这可能仍然有用,具体取决于 OP 试图完成的任务(如果他说不是,我会删除它)。
  • 谢谢@Bubbles,这很有帮助,它与预定义的数组配合得很好。感谢您的发表。但 jeaheung 的答案更符合我的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多