我如何在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)>'
4条答案
按热度按时间8nuwlpux1#
这里的
if args[1] == nil
验证了ARGV
中的第二个值是否为nil
,并将其设置为1
,但是在while
语句中,您使用的是second_arg
,它已经获取了args[1]
的值,因此,它很可能无法通过验证:您可以尝试在该验证中设置
second_arg
变量,而不是设置args[1]
:另外,“* Ruby中的任何语句都返回最后一个求值表达式的值 *",因此,您可以将
str
作为repeat
方法中的最后一个值,并将其作为返回值进行求值。fbcarpbf2#
你完全把这个问题搞得太复杂了。这里没有必要使用可变长度参数列表。这样做比较慢,需要更多的代码,而且不太清楚。测试代码本身就说明了这一点:“提示:* 默认值 *”
这是表示循环的一种更优雅的方式,如:
d4so4syb3#
您必须先设定
args[1]
,然后再设定second_arg
。您也可以改用条件式指派运算子:
z8dt9xmd4#