2010-08-25 3 views
1

я следующий как часть классаСинтаксическая ошибка, неожиданный «=»

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 
        ^

Что дают, также заранее спасибо, это сводит меня с ума.

+2

Имя переменной содержит «?», Оно не должно. – taro

ответ

3

имена переменных (с несколькими исключениями, указанными ниже) могут содержать только буквы, цифры и знак подчеркивания. (Кроме того, они должны начинаться с буквы или подчеркивания, они не могут начинаться с числа.) Вы не можете использовать ? или ! в имени переменной.

Помимо этого правила, есть сильный конвенции в Ruby, что знак вопроса в конце что-то указывает на метод, который возвращает логическое значение:

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

Таким образом, даже если вы могли бы использовать его, переменная вроде first_line? путала бы (а затем раздражала) ад из рубистов. Они ожидали, что это будет метод, проверяющий, была ли что-то первой линией чего-то (что бы это ни говорило в контексте).

Исключения около имен переменных:

  • Глобальные переменные начинаются с $ - например, $stdin для стандартного ввода.
  • Переменные экземпляра начинаются с @ - например. @name для объекта
  • Переменные классов начинаются с @@ - например. @@total для одного класса
+0

есть стандартный синтаксический способ определения переменных voolean? – Intentss

+0

С буквами без ASCII вы можете поместить все виды странных вещей в имя переменной. –

+0

Позвольте мне спросить об этом по-другому: «Рубисты предпочитают конкретный способ определения переменных, которые будут такими же баловскими, чтобы читатель был уверен в том, что они обаумны. Например, в Objective-C вы видите isFoo во многих местах. – Intentss

4

Я полагаю, вы не можете назвать переменные '?' в конце.

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 

Если вы не поклонник тройного оператора (х у: г), то вы можете сделать их сослагательное наклонение :

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 
+0

Мне это нравится, но там нужно добавить круглые скобки, т.е. (index == 0? Selection.to_s (true): selection.to_s) и (index% 5? "$": "\ R") – Intentss

0

имен переменных позволяют не-ASCII буквы, и есть non-ASCII versions знака вопроса, так что вы можете поставить знаки вопроса (а также некоторые формы космических символов) в имена переменных.

+2

Опять же, пояснение полезно, но я бы сказал, что существует огромное различие (в данном случае) между тем, что вы * можете сделать, и тем, что вы * должны делать. – Telemachus

Смежные вопросы