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

How to Find the Middle Character(s) in Ruby?

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

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

  2. 如果字符串长度是奇数,它会 return 只有中间字符

我整理了这段代码,但它不起作用:

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

我认为问题出在语法上,而不是逻辑上,我希望有人能找出语法错误可能出在哪里。

非常感谢您的帮助!

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

首先,您似乎误解了 index 字符串方法的工作原理。它不是 return 给定索引处的字符,而是给定子字符串或正则表达式的索引,如 documentation:

中所示

Returns the index of the first occurrence of the given substring or pattern (regexp) in str.

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

最后,您使用的是 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? 因为它更能揭示意图,而且实际上是 ruby 找出整数是偶数还是奇数的方法。

既然 olerass 已经回答了您对语法的疑问,我会建议您针对标题中的问题提供一个更简洁的解决方案:

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

您可以使用 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

两个return相同的结果:

   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"
#              ^^

试试这个:

def get_middle(s)
  x = (s.length/2) 
  s.length.even? ? s[x-1..x] : s[x]
end
  1. 相同的答案,语法只是合并了。
  2. 格式(逻辑结果)? (如果为真,这是结果):(如果为假,这是结果)

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