这是我的问题代码
if (i == '*' || i == '\' || i == '+' || i == '-' )
但经过大量研究后,我无法弄清楚如何简单地检查i == '\'
的平等性
布朗尼指出,如果你能指导我一个更简单的解决方案。我想要解析一个字符串并改变任何数学运算符+ -> :+, * -> :* ...etc
我想到的一个想法就是有4个gsub()
函数,但这会产生两个问题(1)仍然需要弄清楚如何用'\'来检查是否相等,更重要的是,(2)我觉得这有很多代码重复,而且我听说这是Ruby中的一个很大的风格'不'。
答案 0 :(得分:3)
尝试
i == '\\'
\
是escape character,这意味着它通常不代表自己,而是改变紧随其后的角色会发生什么。例如,您可以使用它在单个带引号的字符串中放置单引号:
test = 'hello \'world\''
puts test
# ==> hello 'world'
或在双引号字符串中添加换行符:
test = "hello\nworld"
puts test
# ==> hello
# world
因此,为了单独使用它,你必须将其转义,导致双斜线:\\
。
至于更简单的if语句,怎么样
if %w{* \\ + -}.include?(i)
...
答案 1 :(得分:2)
'\\'
是如何声明一个字符串为\
的字符串。
您可能认为不是的原因是因为irb报告包含引号和转义序列的字符串的inspect
值。
irb(main):010:0> '\\'
=> "\\"
但是,如果您使用puts
查看字符串,您会看到它是正确的:
irb(main):012:0> puts "\\"
\
所以你想要:
i == '\\'
至于重构,我建议使用一组运算符字符串,然后检查该数组中是否有该运算符。
operators = ['+', '-', '*', '\\']
if operators.member? i
# valid operator
end
但等等......通常不是a/b
而不是a\b
?提示分子 over 分母是一个正斜线。反斜杠没有多大意义。事实上,反斜杠被用作转义字符,因为它在大多数其他环境中几乎无用。
所以你应该使用不包含特殊字符的'/'
,并按照你的预期工作。
答案 2 :(得分:1)
我想解析一个字符串并更改任何数学运算符
+ -> :+, * -> :*
...等等
String#gsub
可行:
puts 'a + b * c - d \ e'.gsub(/([+*-\\])/, ':\1')
输出
a :+ b :* c :- d :\ e