在Ruby中循环一个字符串

在Ruby中循环一个字符串,ruby,string,Ruby,String,我正在输入“901000”作为以下方法的参数,我希望它删除最后三个零并返回“901” 但它会返回“91”。我无法理解为什么我的代码不起作用。有人能帮忙吗?首先,str是“901000”,i=str.length-1是5,str[i]是“0”。因此, str = str.delete(str[i]) 相当于 str = "901000".delete("0") 这将为您提供“91” 然后,通过i=i-1,i变成4,str[i](相当于“91”[4])变成nil,str[i]==0(相当于nil

我正在输入
“901000”
作为以下方法的参数,我希望它删除最后三个零并返回
“901”


但它会返回
“91”
。我无法理解为什么我的代码不起作用。有人能帮忙吗?

首先,
str
“901000”
i=str.length-1
5
str[i]
“0”
。因此,

str = str.delete(str[i])
相当于

str = "901000".delete("0")
这将为您提供
“91”

然后,通过
i=i-1
i
变成
4
str[i]
(相当于
“91”[4]
)变成
nil
str[i]==0
(相当于
nil==0
)变成
false
。因此循环结束,返回值
str
,即
“91”


要想做你想做的事,一些简单的方法是:

"901000".sub(/0+\z/, "") # => "901"
"901000"[/.*?(?=0+\z)/] # => "901"

我也不喜欢它,但这里有一种不使用正则表达式的方法:
str.reverse.to\u I.to\u s.reverse
。还有
str.chomp!(“0”)当str[-1]==“0”
@mudasobwa时,您也可以使用
chop因为while循环已经检查了
“0”
是最后一个字符。我假设您想删除所有尾随的零,而不一定是三个。如果是这样,你应该通过编辑来澄清这一点。使用
str.chop
str.chop
而不是
str.delete(str[i])
"901000".sub(/0+\z/, "") # => "901"
"901000"[/.*?(?=0+\z)/] # => "901"