Ruby 无法生成的字符串比较,强制elsif失败

Ruby 无法生成的字符串比较,强制elsif失败,ruby,string-comparison,ruby-1.8,Ruby,String Comparison,Ruby 1.8,在回答时,我在回答中遇到了一个问题 我一直在测试这一点,我甚至不能让这两个比较在代码中工作,尽管事实上IRB有正确的行为。我真的需要一些帮助 下面是代码,下面是问题的解释 def solve_expression(expr) chars = expr.split '' # characters of the expression parts = [] # resulting parts s,n = '','' # current characters while(n = ch

在回答时,我在回答中遇到了一个问题

我一直在测试这一点,我甚至不能让这两个比较在代码中工作,尽管事实上IRB有正确的行为。我真的需要一些帮助

下面是代码,下面是问题的解释

def solve_expression(expr)
  chars = expr.split '' # characters of the expression
  parts = []  # resulting parts
  s,n = '','' # current characters

  while(n = chars.shift)
    if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-') # only concatenate when it is part of a valid number
      s += n
    elsif (chars[0] == '(' && n[0] == '-') || n == '(' # begin a sub-expression
      p n # to see what it breaks on, ( or -
      negate = n[0] == '-'
      open = 1
      subExpr = ''
      while(n = chars.shift)
        open += 1 if n == '('
        open -= 1 if n == ')'
        # if the number of open parenthesis equals 0, we've run to the end of the
        # expression.  Make a new expression with the new string, and add it to the
        # stack.
        subExpr += n unless n == ')' && open == 0
        break if open == 0
      end
      parts.push(negate ? -solve_expression(subExpr) : solve_expression(subExpr))
      s = ''
    elsif n.match(/[+\-\/*]/)
      parts.push(n) and s = ''
    else
      parts.push(s) if !s.empty?
      s = ''
    end
  end
  parts.push(s) unless s.empty? # expression exits 1 character too soon.

  # now for some solutions!
  i = 1
  a = parts[0].to_f # left-most value is will become the result
  while i < parts.count
    b,c = parts[i..i+1]
    c = c.to_f
    case b
      when '+': a = a + c
      when '-': a = a - c
      when '*': a = a * c
      when '/': a = a / c
    end
    i += 2
  end
  a
end
def solve_表达式(expr)
chars=expr.split“”#表达式的字符
零件=[]#结果零件
s、 n='',#当前字符
while(n=字符移位)
if(s+n).match(/^(-)[.d]+$/)| | |(!chars[0].nil?&&chars[0]!='&&n='-')仅当它是有效数字的一部分时才连接
s+=n
elsif(chars[0]='('&&n[0]='-')| n=='('#开始一个子表达式
p n#看看它会在什么地方断裂,(或-
否定=n[0]='-'
开=1
subExpr=''
while(n=字符移位)
如果n=='('
打开-=1,如果n==')'
#如果开括号的数目等于0,我们已经运行到
#使用新字符串创建一个新表达式,并将其添加到
#堆叠。
子表达式+=n,除非n==')'&&open==0
如果打开=0,则中断
结束
parts.push(否定?-solve_表达式(subExpr):solve_表达式(subExpr))
s=“”
elsif n.match(/[+\-\/*]/)
零件。推(n)和s=“”
其他的
零件。如果!s为空,请按?
s=“”
结束
结束
parts.push,除非s.empty?#表达式过早退出1个字符。
#现在来看一些解决方案!
i=1
a=零件[0]。至_f#最左边的值将成为结果
当我数数的时候
b、 c=零件[i..i+1]
c=c到f
案例b
当“+”时:a=a+c
当“-”时:a=a-c
当“*”时:a=a*c
当“/”时:a=a/c
结束
i+=2
结束
A.
结束
问题出现在
否定的赋值中

当表达式前面的字符是破折号时,我需要否定为true,但条件甚至不起作用。无论是
n=='-'
还是
n[0]='-'
,引号的形式都不重要,每次都是FALSE。然而,我一直在使用这个精确的比较,
n='(
每次都能正确工作

发生了什么事?为什么
n='-'
不起作用,而
n='('
起作用?这是在UTF-8中编码的,没有BOM,UNIX换行符

我的代码怎么了?

您有:

if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-')
      s += n
elsif (chars[0] == '(' && n[0] == '-') || n == '('
由于
n
始终是一个单字符字符串,如果
(chars[0]='('&&n[0]='-')
为真,那么前面的条件,
(!chars[0].nil?&&chars[0]!='&&n='-'
,也将为真。如果
n[0]='-'
,您的代码将永远不会进入
的第二部分

如果您的
pn
行正在输出破折号,请确保它与您要查找的字符完全相同,而不是某些看起来像破折号的字符。Unicode有多种破折号,可能您的代码或输入中有一个奇怪的Unicode破折号字符。

您有:

if (s + n).match(/^(-?)[.\d]+$/) || (!chars[0].nil? && chars[0] != ' ' && n == '-')
      s += n
elsif (chars[0] == '(' && n[0] == '-') || n == '('
由于
n
始终是一个单字符字符串,如果
(chars[0]='('&&n[0]='-')
为真,那么前面的条件,
(!chars[0].nil?&&chars[0]!='&&n='-'
,也将为真。如果
n[0]='-'
,您的代码将永远不会进入
的第二部分


如果您的
pn
行正在输出破折号,请确保它与您要查找的字符完全相同,而不是某些看起来像破折号的字符。Unicode有多种破折号,可能您的代码或输入中有一个奇怪的Unicode破折号字符。

非常感谢,我没有想到前面的语句h广告捕捉到了我的代码。谢谢你的新鲜目光。非常感谢,我没有想到之前的声明捕捉到了我的代码。谢谢你的新鲜目光。