“如果等于一封信”

时间:2014-09-11 01:09:43

标签: ruby arrays alphabetical

我正在尝试编写一个接收没有空格的字符串的方法。我想要它做的就是返回" bug"当字符串中的字符是字母[A-Za-z]并返回" ant"如果它是任何其他角色。

def Letter(str)
    (0..str.length).to_a do |index|
        if str[index].chr =~ /[A-Za-z]/ ##I think this is where things are going wrong.
            puts "bug"
        else
            puts "ant"
        end
    end
end 

有没有人知道如何解决这个问题?我不断获得连续数字的数组。

2 个答案:

答案 0 :(得分:3)

重写

def letter(str)
  str.each_char.map do |char|
    (char =~ /[[:alpha:]]/) ? 'bug' : 'ant'
  end
end

在您的代码中,您正在尝试打印“bug”或“ant”;但你返回 (0..str.length).to_a。此函数将返回一组错误和蚂蚁。它也变得更加Rubyish:

  • 方法应该是snake_case(小写,单词之间用下划线)
  • 使用each_char
  • 可以更轻松地遍历字符串
  • [A-Za-z]没问题,但[[:alpha:]]更清晰,处理Unicode内容。
  • 因为我们正在测试每个角色,你知道它将是一个字符长,所以你不需要行的起点和行尾锚。

答案 1 :(得分:-1)

def letter(str)
    str.chars.each do |x|
        puts x=~ /[A-Za-z]/ ? "bug" : "ant"
    end
end 
  • 首先,在您的循环中,您正在尝试转换范围 成阵列。

    (0..str.length).to_a

str.length返回一个数字,因此将其放入数组将为您提供一个数字数组。因此你的问题。

  • 其次,您必须在/a-zA-Z/正则表达式

  • 周围加上括号
  • 第三,使用三元运算符。对于小if语句来说它很棒。下面是语法:

    布尔值? "如果布尔值为true,则此代码将执行" :"否则此代码将"

  • 第四,使用.each方法,部分因为循环的简单和迭代而喜欢ruby!

快乐的编码!