2014-01-15 2 views
0

Вот мой код в вопросеКак проверить, если строка == «» (буквальный символ)

if (i == '*' || i == '\' || i == '+' || i == '-') 

Но после того, как много исследования, я не могу понять, как просто проверить равенство из i == '\'

домовой очков, если вы можете направить меня к более простому решению. Я хочу, чтобы разобрать строку и изменить какие-либо математические операторы, как такой + -> :+, * -> :* ...etc Одна идея, которую я имел в виду, будет иметь 4 gsub() функции, но это создает два проблемы (1) все еще должны выяснить, как проверить равенство с «\» и, что более важно, (2) я чувствую, что это много c ода, и из того, что я слышу, это большой стилистический «нет» в Ruby.

+1

у вас попытался убежать от него? '' \\ '' – sircapsalot

+2

Не'/'обычно используется для деления? Переводит ли 'a \ b' на' b/a' или что-то еще? –

ответ

2

'\\' как вы объявляете строку с одним символом, который является \.

Причина, по которой вы думаете, что это не так, потому что irb сообщает значение inspect значения строки, которая включает в себя кавычки и escape-последовательности.

irb(main):010:0> '\\' 
=> "\\" 

Однако, если вы используете puts вид строка вместо этого, вы увидите, что это правильно:

irb(main):012:0> puts "\\" 
\ 

Так что вы хотите:

i == '\\' 

Что касается рефакторинга, Я бы рекомендовал массив строк оператора, а затем проверил, есть ли этот оператор в этом массиве.

operators = ['+', '-', '*', '\\'] 

if operators.member? i 
    # valid operator 
end 

Но подождите ... это не деление обычно a/b и не a\b? Это косая черта, чтобы намекнуть на числитель за знаменатель. Обратная косая черта не имеет большого смысла. Фактически обратная косая черта используется в качестве escape-символа из-за почти бесполезности в большинстве других контекстов.

Значит, вы должны использовать '/', который не содержит специальных символов и работает так, как вы ожидаете.

+0

не уверен, как я сделал '\' вместо '/', но спасибо за улучшенную версию! @Alex Wayne – Maksim

3

Попробуйте

i == '\\'

\ является escape character, что означает, что она обычно не представляет себя, а скорее меняет то, что происходит с характером сразу же после этого. Например, вы можете использовать его, чтобы поместить апостроф внутри одной строки в кавычках:

test = 'hello \'world\'' 
puts test 
# ==> hello 'world' 

или добавить новую строку в двойных кавычках:

test = "hello\nworld" 
puts test 
# ==> hello 
# world 

Так что для того, чтобы использовать его вы должны избежать этого, что приведет к двойной косой чертой: \\.

Что касается проще, если заявление, как о

if %w{* \\ + -}.include?(i) 
    ... 
1

Я хочу, чтобы разобрать строку и изменить какие-либо математические операторы, как такой + -> :+, * -> :* ... и т.д.

String#gsub будет работать:

puts 'a + b * c - d \ e'.gsub(/([+*-\\])/, ':\1') 

Выход

a :+ b :* c :- d :\ e 
Смежные вопросы