通过字符串循环?

时间:2014-05-30 17:14:35

标签: ruby

我最近一直试图通过转换我用Python编写的简单程序来学习Ruby。

在Python中,我有一个程序,它定义了一个函数,该函数接受一个字符串并返回一个新字符串,该字符串是旧字符串,每个字符之间都有一个破折号。

因此,“你好”将以“-h-e-l-l-o”的形式返回。

在Python中,这非常简单,因为您只需循环遍历原始字符串的每个字符,并将其添加到新字符串加上破折号。

然而,在Ruby中这似乎更难,因为据我所知,我不能只在Ruby中循环一个字符串。

这样做的好方法是什么?

5 个答案:

答案 0 :(得分:6)

是..你可以

"hello".chars.map { |c| "-#{c}" }.join
 # => "-h-e-l-l-o"

查看更多Ruby功能

string = 'hello'
"-%s" * string.size % string.chars
# => "-h-e-l-l-o"

查看#*#%的文档。

答案 1 :(得分:1)

你也可以这样做......

"hello".split('').join('-')
嗯,但它并没有给你领先。但是你明白了。

如果你真的需要领先的' - '你可以这样做....

"hello".split('').reduce(''){|s,c| s += '-' + c}

我现在学到的东西可以做得更好:

"hello".chars.reduce(''){|s,c| s += '-' + c}

答案 2 :(得分:1)

什么意思是“循环通过字符串”。你循环遍历字符,所以在Ruby中你写的就是:

'abba'.each_char { |c| puts c }

但是你正在努力实现其他目标(你已经写了别的东西,你的例子就是别的东西)。有两种方法可以实现你所说的:

'hello'.chars.join('-')

'hello'.gsub(//, '-')

两者都将返回相同的字符串:h-e-l-l-o

要实现您的示例,您可以使用regexp:

'hello'.gsub(/(\w)/, '-\1')

或地图

'hellp'.each_char.map { |c| "-#{c}" }.join

但第二个恕我直言会慢一些。

答案 3 :(得分:1)

完成后,一个不使用显式迭代器的方法:

([''] + s.split('')).join('-')

答案 4 :(得分:1)

这是另一种方式 - 只是为了好玩:

'-' + 'hello'.chars * '-'
# => "-h-e-l-l-o"

我在这里使用#*,对于一个字符串数组,join,通过连接每对字符'-'。我没有将模拟对象添加到第一个破折号的数组的开头,而是选择在开头简单地粘贴'-' ...