语法错误,意外'='

时间:2010-08-25 10:26:35

标签: ruby

我将以下内容作为课程的一部分

def to_s
   i = 0
   first_line? = true
   output = ''
   @selections.each do | selection |
      i += 1
      if first_line?
         output << selection.to_s(first_line?)
         first_line? = false
      else
         output << selection.to_s
      end
      if i >= 5
         output << "\r"
         i = 0
      else (output << " $ ")
      end
   end
   return output
end 

我收到以下语法错误

SyntaxError: list2sel.rb:45: syntax error, unexpected '='
    first_line? = true
                 ^
list2sel.rb:47: syntax error, unexpected keyword_do_block, expecting keyword_end
    @selections.each do | selection |
                       ^
list2sel.rb:51: syntax error, unexpected '='
        first_line? = false
                     ^

什么给予,也提前感谢,这让我疯狂。

4 个答案:

答案 0 :(得分:4)

我想,你不能用'?'命名变量最后。

答案 1 :(得分:3)

我相信这是一种更简洁的方式来做上述(未经测试):

def to_s 
  output = ""
  @selections.each_with_index do | selection,line |  
    output << line==0 ? selection.to_s(true) and next : selection.to_s
    output << line % 5 ? " $ " : "\r"
  end 
  return output 
end

如果你不是三元运算符(x?y:z)的粉丝,那么你可以制作ifs:

def to_s 
  output = ""
  @selections.each_with_index do | selection,line |  
    if line==0
      output << selection.to_s(true)
    else
      output << selection.to_s
      if line % 5
        output << " $ "
      else
        output << "\r"
      end
    end
  end
  return output 
end  

答案 2 :(得分:3)

变量名称(下面列出一些例外情况)只能包含字母,数字和下划线。 (另外,它们必须以字母或下划线开头;它们不能以数字开头。)您不能在变量名中使用?!

除了这个规则之外,Ruby中有一个约定,在某些内容的末尾有一个问号表示一个返回布尔值的方法:

4.nil? # => returns false....

所以,即使你可以使用它,像first_line?这样的变量也会混淆(然后惹恼)Rubyists的地狱。他们希望这是一种方法,可以测试某些东西是否是第一行的东西(无论在上下文中是什么意思)。

有关变量名称的例外情况:

  • 全局变量以$开头 - 例如,$stdin用于标准输入。
  • 实例变量以@开头 - 例如对象的@name
  • 类变量以@@开头 - 例如一个班级@@total

答案 3 :(得分:0)

变量名称允许使用非ASCII字母,并且问号有non-ASCII versions,因此您可以将问号(以及某些形式的空格字符)放入变量名称中。