Ruby - можно ли использовать тернарный оператор в процессе?

Я прохожу курс Ruby на TestFirst.org и столкнулся с проблемой кодирования, которая потребовала от меня создания метода titleize, который использует каждое слово в строке с заглавной буквы, кроме «маленьких слов».

Следующий код решает проблему.

def titleize(words)
  little_words = %w[a an the and but or for nor on at to from by over]

  capitalizer = Proc.new do |word|
    if little_words.include? word
      word
    else
      word.capitalize
    end
  end

  words.split.map(&capitalizer)*' '
end

Первоначально я пробовал использовать следующую процедуру.

capitalizer = Proc.new { |word| little_words.include? word ? word : word.capitalize }

Однако эта процедура вернула только истинные значения. Значения истинности исходили от того, был ли проверяемый word включен в массив little_words. Это наводит меня на мысль, что процедура возвращается еще до того, как оценивает код справа от вопросительного знака.

Я прочитал документацию Ruby для обоих процессов и тернарного оператора, но я не нашел ничего относительно того, можно ли их использовать вместе.

Я искал Stack Overflow по запросу «proc ruby ​​ternary» и прочитал похожие вопросы, которые возникли, когда я начал публиковать этот вопрос. Я там тоже ничего не нашел.

Итак, я подошел к вам, гениям Stack Overflow. У меня вопрос.

Можно ли в Ruby использовать тернарный оператор в процессе?

(и если да, то почему моя маленькая процедура не сработала?)


person Cities    schedule 04.06.2016    source источник
comment
Конечно их можно использовать вместе, процедуры не были бы очень полезны, если бы существовали причудливые произвольные правила о том, какой код вы можете писать внутри них. Если бы вы просто попробовали написать свой тернар вне процедуры, вы бы быстро поняли, что наличие процедуры не имеет ничего общего с вашей проблемой.   -  person meagar    schedule 05.06.2016
comment
поскольку в ответе @seph похоже, что в вашей проблеме отсутствует скобка на include?(word) - какая-то проблема синтаксического анализа.   -  person max pleaner    schedule 05.06.2016
comment
@Cities Убедитесь, что вы приняли ответ, установив галочку рядом с ответом. Галочка изменит цвет на зеленый, чтобы указать, что предложение принято.   -  person Michael Gaskill    schedule 05.06.2016


Ответы (1)


Пытаться:

capitalizer = Proc.new { |word| little_words.include?(word) ? word : word.capitalize }

Это должно сработать.

person seph    schedule 04.06.2016
comment
Ага! Это исправляет. Спасибо :). Можно ли из этого сделать вывод, что при использовании процедуры каждый компонент должен быть написан вместе? То есть, при написании процедуры нельзя использовать функцию Ruby, которая позволяет опускать скобки? - person Cities; 05.06.2016
comment
@Cities - процедура - это всего лишь блок кода. Проблема заключалась в том, что тернарный оператор запутался с открытой парной формой вызова метода. - person seph; 05.06.2016
comment
Правильно! Я предполагаю, что я хотел спросить, всегда ли открытые скобки сбивают с толку тернарный оператор? Кажется, что так. - person Cities; 05.06.2016
comment
@Cities - Да, будет. Вы хотите закрыть все скобками или, как мы сделали здесь, с закрытой формой вызова метода в каждой из трех секций тернарного оператора. Кстати, если это ответ на ваш вопрос, пожалуйста, нажмите галочку. Это позволяет людям узнать, что на этот вопрос был дан удовлетворительный ответ. Плюс я получаю интернет-очки. - person seph; 05.06.2016
comment
нет ничего об использовании процедуры, которая требует от вас использования скобок. Вам нужно использовать круглые скобки там, внутри или вне процесса, чтобы было понятно, что с чем идет. Я полагаю, что без скобок рубин интерпретировал как: little_words.include?(word ? word : word.capitalize) - person jrochkind; 05.06.2016