如何在Ruby中重复一个字符串一次或多次

4xrmg8kj  于 2022-11-04  发布在  Ruby
关注(0)|答案(4)|浏览(160)

我如何在Ruby中重复一个字符串一次或多次?

def repeat(*args)
  str, second_arg, count = "", args[1], 1
   if args[1] == nil
     args[1] = 1
   end
    while second_arg >= count
      str += args[0] + " "
      second_arg -= 1
    end

  return str
end

我列出的测试是:

describe "repeat" do
    it "should repeat" do
      expect(repeat("hello")).to eq("hello hello")
    end

    # Wait a second! How can you make the "repeat" method
    # take one *or* two arguments?
    #
    # Hint: *default values*
    it "should repeat a number of times" do
      expect(repeat("hello", 3)).to eq("hello hello hello")
    end
  end

如果缺少argument[1],我想用值“1”填充它,这样它至少会返回1。
这是我的错误:

Failures:

  1) Simon says repeat should repeat
     Failure/Error: expect(repeat("hello")).to eq("hello hello")
     NoMethodError:
       undefined method `>=' for nil:NilClass
     # ./lib/03_simon_says.rb:14:in `repeat'
     # ./spec/03_simon_says_spec.rb:39:in `block (3 levels) in <top (required)>'
8nuwlpux

8nuwlpux1#

这里的if args[1] == nil验证了ARGV中的第二个值是否为nil,并将其设置为1,但是在while语句中,您使用的是second_arg,它已经获取了args[1]的值,因此,它很可能无法通过验证:

if args[1] == nil
  args[1] = 1
end

您可以尝试在该验证中设置second_arg变量,而不是设置args[1]

if args[1] == nil
  second_arg = 1
end

另外,“* Ruby中的任何语句都返回最后一个求值表达式的值 *",因此,您可以将str作为repeat方法中的最后一个值,并将其作为返回值进行求值。

fbcarpbf

fbcarpbf2#

你完全把这个问题搞得太复杂了。这里没有必要使用可变长度参数列表。这样做比较慢,需要更多的代码,而且不太清楚。测试代码本身就说明了这一点:“提示:* 默认值 *”

def repeat(str, count = 2)
    Array.new(count, str).join(" ")
end

这是表示循环的一种更优雅的方式,如:

def repeat(str, count = 2)
    result = str

    (0..count).each { result += " " + str }

    result
end
d4so4syb

d4so4syb3#

您必须先设定args[1],然后再设定second_arg

def repeat(*args)
    args[1] = 1 if args[1] == nil
    str, second_arg, count = "", args[1], 1

    while second_arg >= count
      str += args[0] + " "
      second_arg -= 1
    end

    return str
end

您也可以改用条件式指派运算子:


# The two lines do the same thing

args[1] = 1 if args[1] == nil
args[1] ||= 1
z8dt9xmd

z8dt9xmd4#

"hello" * 5 # => "hellohellohellohellohello"

Array.new(5, "hello").join(" ") # => "hello hello hello hello hello"

相关问题