如何找到 Ruby 中的中间字符?
How to Find the Middle Character(s) in Ruby?
我正在尝试在 Ruby 中编写一个方法:
如果字符串长度为偶数,则return中间两个字符,
如果字符串长度是奇数,它会 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
- 相同的答案,语法只是合并了。
格式(逻辑结果)? (如果为真,这是结果):(如果为假,这是结果)
def get_middle(s)
num = s.length
num.even? ? ( s[num/2-1] + s[num/2]) : (s[num/2])
end
我正在尝试在 Ruby 中编写一个方法:
如果字符串长度为偶数,则return中间两个字符,
如果字符串长度是奇数,它会 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
- 相同的答案,语法只是合并了。
格式(逻辑结果)? (如果为真,这是结果):(如果为假,这是结果)
def get_middle(s) num = s.length num.even? ? ( s[num/2-1] + s[num/2]) : (s[num/2]) end