2016-12-16 1 views
0

Что я хотел здесь сделать, это вставить um после каждой константы. Мне нужно передать каждый символ строки с добавлением um, а затем передать его блоку, связанному с методом. Я не понимаю, как передать символы в блок с помощью экземпляра блока.Как использовать метод regex с блоком?

class Um  
    def to_um(string) 
    string.gsub(/(?<=[^aeiou])/, 'um') do |v| 
     "#{v}" 
    end 
    end 

    def to_english(string) 
    # will output the to_um method back to english 
    end 
end 

Um.to_um("Watch this get converted to yum!") { |v| print v } 

Выведите:

Wumatumcumhum tumhumisum gumetum cumonumvumerumtumedum tumo yumumum! 
+0

Вы спрашиваете, как написать метод, который занимает блок? Или вы спрашиваете, как использовать 'String # gsub' с блоком? – RJHunter

+0

Я спрашиваю, как вставить 'um' после каждой константы в строке с использованием регулярного выражения, в котором передается блок для вывода. Я новичок в рубине, поэтому любой совет поможет. Спасибо –

+0

Это слишком много вещей для хорошего вопроса о переполнении стека. Выберите один из них, прочитайте документацию об этом, затем разместите вопрос, описывающий то, что вы читаете, и то, что вы не понимаете. – RJHunter

ответ

1

gsub работает с блоком или замены аргумента, а не как. Если вы хотите использовать блок для замены матча, необходимо опустить второй аргумент:

string.gsub(/(?<=[^aeiou])/) { |m| "#{m}um" } 

Обратите внимание, что нет необходимости использовать блок здесь, вы можете включить соответствующий символ в замене аргументе, используя \1:.

string.gsub(/(?<=[^aeiou])/, '\1um') 
+0

Спасибо за помощь meagar! Я буду помнить эту информацию. Итак, еще один вопрос, если я должен был использовать блок здесь, как мне создать экземпляр этого с пропущенными символами из другого блока? Как в последней строке моего кода? –

+0

@ F.uzzy Вы не будете писать код таким образом. Ваш код должен быть просто готов 'ставит Um.to_um ('blah blah')'. Значение возвращается из функции, а не передается блоку. – meagar

+0

Первая часть строки, возвращаемая вашим вторым выражением, - «Wumatumcumhum umtumhumisum umgumetum», но желаемым результатом является «Wumatumcumhum tumhumisum gumetum». Проблема возникает после каждого пробела, так как пробел совпадает с '[^ aeiou]'. Вам просто нужно исправить определение согласных. –

1
CONSONANTS = "bcdfghjklmnpqrstvwxyz" 

def to_um(str) 
    str.gsub(/(?<=[#{CONSONANTS}])/i, 'um') 
end 

str = "Watch this get converted to yum!" 

to_um(str) 
    #=> "Watumcumhum tumhumisum gumetum cumonumvumerumtumedum tumo yumumum!" 

регулярное выражение гласит, «соответствовать согласного в положительном назад ', случай-индифферентно Если есть совпадение, нулевая длина строки после согласной заменяется "um"

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