如何在Ruby中找到中间字符?

时间:2016-01-10 23:15:50

标签: ruby-on-rails ruby debugging syntax syntax-error

我试图在Ruby中编写一个方法:

  1. 如果字符串长度为偶数,则返回中间两个字符,

  2. 如果字符串长度为奇数,则只返回中间字符

  3. 我把这段代码放在一起,但它不起作用:

    def the_middle(s)
       if s.length % 2 == 0
          return s.index(string.length/2-1) && s.index(string.length/2)
       else
          return s.index(string.length/2).round 
       end
    end
    

    我认为问题在于语法,而不是逻辑,我希望有人能够确定语法错误的位置。

    非常感谢你的帮助!

5 个答案:

答案 0 :(得分:3)

实际上,您在该代码中同时存在语法错误和逻辑(语义)错误。

首先,您似乎误解了字符串上的&&方法是如何工作的。它不返回给定索引处的字符,而是返回给定子字符串或正则表达式的索引,如documentation中所示:

  

返回str中给定子字符串或模式(regexp)第一次出现的索引。

当字符串长度为偶数时,您还使用错误的运算符连接两个中间字符。 if s.length.even? && s.length > 2逻辑和运算符。它通常用于条件而不是分配 - 例如在if语句+中。您要使用的运算符是string.length,用于连接字符串。

最后,您使用的是string,但s.length未在任何地方定义。你的意思可能是def the_middle(s) if s.length.even? return s[s.length/2-1] + s[s.length/2] else return s[s.length/2] end end (输入参数)。

正确的解决方案更像是:

s.length % 2 == 0

我冒昧地将s.length.even?替换为docker-machine env --shell cmd default ,因为它更有意图揭示并且真正找到整数是偶数还是奇数的红宝石方式。

答案 1 :(得分:3)

您可以使用String#[]在没有条件的情况下解决此问题。

使用具有负端的范围:

def the_middle(s)
  i = (s.length - 1) / 2
  s[i..-i.succ]
end

或者开始和长度:

def the_middle(s)
  a, b = (s.length - 1).divmod(2)
  s[a, b + 1]
end

两者都返回相同的结果:

   the_middle("a")     #=> "a"
  the_middle("aba")    #=> "b"
 the_middle("abcba")   #=> "c"
the_middle("abcdcda")  #=> "d"
#              ^

  the_middle("abba")   #=> "bb"
 the_middle("abccba")  #=> "cc"
the_middle("abcddcda") #=> "dd"
#              ^^

答案 2 :(得分:1)

试试这个:

def get_middle(s)
  x = (s.length/2) 
  s.length.even? ? s[x-1..x] : s[x]
end

答案 3 :(得分:0)

由于olerass已经回答了你对语法的疑问,我建议你在标题中提出一个不那么冗长的解决方案:

def the_middle(s)
  return s[s.length/2] if s.length.odd?
  s[s.length/2-1] + s[s.length/2]
end

答案 4 :(得分:0)

  1. 相同的答案语法刚刚合并。
  2. 格式(逻辑结果)? (如果这是结果,则为true):(如果为false则为结果)

    def get_middle(s)
       num = s.length
       num.even? ? ( s[num/2-1] + s[num/2]) : (s[num/2])
    end