2014-09-29 4 views
0

Codecademy хочет, чтобы написать код следующим образом капитализировать первую букву за то, что я вход:Использование `capitalize` или` `капитализировать

print "What's your first name?" 
firstname = gets.chomp 
firstname2 = firstname.capitalize 
firstname.capitalize! 
puts "Your first name is #{first_name}!" 

Однако, я написал это как:

print "What's your first name?" 
firstname = gets.chomp.capitalize 
puts "Your first name is #{firstname}!" 

Оба они дают одинаковые результаты, но мой путь кажется намного проще и точным. Мне было интересно, действительно ли эти два кода при создании одного и того же результата будут разными. Есть ли конкретная причина для прохождения дополнительных шагов и повторений с использованием firstname.capitalize!, а не просто добавления capitalize на gets?

+0

[Там более, чем один из способов сделать это] (http://c2.com/cgi/wiki?ThereIsMoreThanOneWayToDoIt) :-) Главное, чтобы отметить это разница между '' capitalize' и прописными буквами! ' –

+0

Первый код не использует 'firstname2' в любом месте. Это не имеет смысла. – sawa

+0

@sawa Я просто иду на уроке. Довольно новый для всего этого. В нем говорится, что он присваивает результаты «firstname2». – St3

ответ

2

capitalize возвращает новую строку с первой заглавной буквой

capitalize! модифицирует или мутирует исходную строку

2.1.1 :001 > string = 'hello' 
=> "hello" 
2.1.1 :002 > string.capitalize 
=> "Hello" 
2.1.1 :003 > string 
=> "hello" 
2.1.1 :004 > string.capitalize! 
=> "Hello" 
2.1.1 :005 > string 
=> "Hello" 

В общем, мутирует объекты не считается хорошей практикой, поскольку это может привести к неожиданные результаты.

Рассмотрим следующий сценарий:

def i_will_capitalize(string) 
    string.capitalize! 
    puts string 
end 

def i_expect_the_original_string(string) 
    puts string 
end 

string = 'hello' 

i_will_capitalize(string) # Returns 'Hello' 
i_expect_the_original_string(string) # Returns 'Hello' as well! 
+0

Отличное спасибо. Так я написал, что «got.chomp.capitalize» хорошая практика для этой ситуации? – St3

+0

Да. Также обратите внимание, что * обычно * любой метод Ruby, который заканчивается ударом ('!'), Изменяет объект-получатель/исходный объект – PericlesTheo

+1

«мутирующие объекты не считаются хорошей практикой», возможно, немного сильны. Например, 'Hash # merge!' (A.k.a. 'update') чрезвычайно полезен при создании хэшей. –

2

capitalize! изменяет строку приемника, тогда как capitalize создает новую строку. В случаях, когда вы не используете строку приемника где-то еще в исходной форме, более эффективно использовать первое; он сохраняет память. В коротком сценарии, подобном этому, это не будет иметь большого значения, но в больших программах, которые выполняют пучки огромных операций с цепочками, это имеет огромное значение. Если моя память правильная, я прочитал что-то, написанное разработчиком SASS, что, заменив gsub s, они имели в более ранней версии кода gsub!, они получили большое улучшение производительности.

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