2016-07-21 8 views
1

Я изучаю методы в Ruby и думаю, что лучший способ узнать их - создать уже существующий метод. Тем не менее, есть две проблемы, которые я бегу, чтобы:Создание модифицированного метода заглавной буквы в Ruby с нуля

  1. Я не знаю, что капитализировать метод выглядит
  2. Мое решение (это не более чем оригинальный метод делает) кажется, что он может быть переработан во что-то более элегантное.

Это то, что я придумал:

# method that capitalizes a word 
def new_capitalize(string) 
    if string[0].downcase == "m" && string[1].downcase == "c" 
    puts "#{string[0].upcase}#{string[1].downcase}#{string[2].upcase}#{string[3..-1].downcase}" 
    else 
    puts "#{string[0].upcase}#{string[1..-1].downcase}" 
    end 
end 

name1 = "ryan" 
name2 = "jane" 

new_capitalize(name1) # prints "Ryan" 
new_capitalize(name2) # prints "Jane" 

str = "mCnealy" 
puts str.capitalize 
     # prints "Mcnealy" 

new_capitalize(str) 
     # prints "McNealy" 

Кажется, если первая часть моего заявления, если можно было бы сделать гораздо более эффективной. Он не должен быть даже близко к моему решению, если он печатает второй капитал, если имя начинается с «mc»

Кроме того, если кто-то может указать мне, где можно найти код встроенного метода capize, который было бы здорово!

Спасибо заранее!

+0

Ваш вопрос плохо сформулированное. Ваше первое предложение противоречит названию и тому, что вы пытаетесь сделать с вашим кодом. Важно, чтобы ваше утверждение вопроса было полным и недвусмысленным. Один или несколько примеров были бы полезны. Когда вы приводите примеры, покажите свой ожидаемый или желаемый результат и назначьте переменную для каждого входного объекта (например, 'str =" mCnealy "), чтобы читатели могли ссылаться на эти переменные в ответах и ​​комментариях, не определяя их. Отправьте свой код после того, как вы четко изложите свой вопрос. –

ответ

1

Хорошо, как насчет:

module NameRules 
    refine String do 
    def capitalize 
     if self[0..1].downcase == 'mc' 
     "Mc#{self[2..-1].capitalize}" 
     else 
     super 
     end 
    end 
    end 
end 

Затем, чтобы использовать его:

class ThingWithNames 
    using NameRules 

    def self.test(string) 
    string.capitalize 
    end 
end 

ThingWithNames.test('mclemon') # => "McLemon" 
ThingWithNames.test('lemon') # => "Lemon" 

Если мы начинали с нуля, а не с помощью C реализованный код:

module NameRules 
    refine String do 
    def capitalize 
     if self[0..1].downcase == 'mc' 
     "Mc#{self[2..-1].capitalize}" 
     else 
     new_string = self.downcase 
     new_string[0] = new_string[0].upcase 
     new_string 
     end 
    end 
    end 
end 

Справочные материалы:

String#capitalize source
A really good presentation on refinements

+0

Удивительный справочный материал! Спасибо, и приятно видеть то, о чем я никогда не слышал. –

1

Во-первых, на мой взгляд, выполнение чего-либо другого, кроме заглавной буквы первой строки, должно быть другим методом или необязательным аргументом, который вы передаете. Во-вторых, если вы пытаетесь имитировать поведение основной библиотеки, вы можете использовать String для monkey-patch.

class String 
    def capitalize 
    self[0].upcase << self[1..-1].downcase 
    end 
end 

Ближайший к официальному реализации рубинового вероятно Rubinius

https://github.com/rubinius/rubinius/blob/377d5c958bc8239514fb98701b75859c6b51b9d4/core/string.rb#L332

+0

Могу ли я рекомендовать использовать 'downcase' в том, что вы добавляете i.e.' self [1 ..- 1] .downcase', чтобы еще больше подражать «реальному» 'String # capitalize'. –

+1

Да, конечно. изм. – nikkypx

+0

Согласен, особенно после просмотра ссылки об уточнениях в сообщении @ Azolo, спасибо за понимание! –

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

  • Нет связанных вопросов^_^