Почему это с помощью оператора concat - PullRequest
0 голосов
/ 21 сентября 2018

Я новичок в ruby, но уверен, что эти вещи эквивалентны.Но я делаю шанс на важный сценарий и просто хотел быть уверенным, пожалуйста.

Вот что у них сейчас:

def generate_names options
  names = []

  name = options.name
  sen = options.sen
  ari = options.ari

  options.targets.each do |target|
    names << "#{name}" + " Test " + "#{target}"
  end

  names
end

Это то, что я хочу изменить на, обратите внимание на строку names << Я удалил +.Это точно так же, верно?Я даже сделал тест на равенство, но просто хочу убедиться.

def generate_names options
  names = []

  name = options.name
  sen = options.sen
  ari = options.ari

  options.targets.each do |target|
    names << "#{name} Test #{target}"
  end

  names
end

Кроме того, я попробовал это в irb, но оно дает ошибку:

"#{name}" + " Test " + "#{target}".eql?("#{name} Test #{target}") ? "equal" : "not"

Ошибка дана:

TypeError: no implicit conversion of false into String
    from (irb):20:in `+'
    from (irb):20
    from /usr/bin/irb:12:in `<main>'

1 Ответ

0 голосов
/ 21 сентября 2018

Посмотрите на это по отдельности:

names << "#{name}" + " Test " + "#{target}"

Это действительно неправильный код."#{name}" будет эквивалентно name, если это строковое значение, поэтому кавычки посторонние, и, что еще хуже, создайте еще одну строку, которая будет немедленно выброшена.Эта одна строка создает только четыре строки.

Другая лучше:

names << "#{name} Test #{target}"

Это создает одну строку и вставляет ее.Интерполяция почти всегда лучше конкатенации, потому что она создает меньше мусора.

Ваш irb тест имеет недостатки:

"#{name}" + " Test " + "#{target}".eql?("#{name} Test #{target}") ? "equal" : "not"

Это сначала оценивает .eql? часть на just target, который явно не совпадает, поэтому он оценивается как:

("#{name}" + " Test " + false) ? "equal" : "not"

Что не получится, потому что вы не можете объединить false и строку.

Чтобы проверить это, нужно вызвать определенный порядок оценки:

("#{name}" + " Test " + "#{target}").eql?("#{name} Test #{target}") ? "equal" : "not"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...