【问题标题】:Ruby string concatenation add spaceRuby字符串连接添加空格
【发布时间】:2013-06-17 04:43:11
【问题描述】:

我需要创建一个重复给定单词的方法,但我认为我设计错了。我需要单词之间的空格,我在这里缺少什么?

def repeat(word, repeats=2)
  sentence = word.to_s * repeats
  return sentence
end

【问题讨论】:

  • 用反对票克服自己。即使这是一个看似简单的问题,但以不同的方式解决问题或给某人一个教学的机会也很有价值。

标签: ruby methods


【解决方案1】:

当然,你缺少空格。

你可以这样做:

def repeat(word, repeats = 2)
  Array.new(repeats, word).join(" ")
end

【讨论】:

  • 另外,略短但不确定它是否更具可读性:([word] * repeats).join(' ')
  • 更短:([word] * repeats) * ' '
  • 当您可以一步完成所有这些时,为什么要创建一个包含单个元素的时间数组并在此基础上构建呢?除非您正在打高尔夫球,否则按令牌计算比计算字节更有意义。
【解决方案2】:

您可以编写如下代码:

def repeat(word, repeats=2)
  ([word] * repeats).join(" ")
end

repeat("Hello",4)
# => "Hello Hello Hello Hello"

【讨论】:

  • 我相信这是我前进的方向。我有def repeat(word,repeats=2) sentence = word.to_s * repeats return sentence.join(" ") end,但在看到这个之后,这似乎很愚蠢,我明白为什么它如此错误:)
【解决方案3】:

这是一种更接近您的方法且不使用临时数组的方法:

def repeat(word, repeats=2)
  ("#{word} " * repeats).chop
end
  • "#{word} " 使用字符串插值将单词转换为字符串并附加一个空格
  • … * repeats 创建一个包含 repeats 个副本的字符串
  • .chop 返回去掉最后一个字符的字符串(尾随空格)

不必创建数组使代码更快。

【讨论】:

  • 所以如果你这样做数千次,你可以节省几分之一秒?谁在乎?
  • 重点是你不必创建一个临时数组,拥有更快的代码是一个很好的副作用。
  • 但是您已经竭尽全力对其进行基准测试,就好像速度是重要的指标一样。不是。
  • @sawa 返回一个删除了最后一个字符的新字符串——这正是我在这种情况下想要的。 IMO 既不是 chomp!(" ") 也不是 [0..-2] 更干净或更漂亮。
【解决方案4】:
w = 'kokot'
n = 13
n.times.map { w.each_char.to_a.shuffle.join }.tap { |a, _| a.capitalize! }.join(' ') << ?.

【讨论】:

    猜你喜欢
    • 2011-01-26
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2013-12-21
    • 2020-04-19
    • 1970-01-01
    • 2016-03-01
    相关资源
    最近更新 更多