我无法升级或资本化

时间:2013-10-22 08:27:03

标签: ruby

我无法理解为什么word没有大写或大写。

class Book
  attr_accessor :title
  def title=(changed_title)
    changed_title.split(" ").map!{|word|
      word.to_s.capitalize
      }.join(" ")
    @title = changed_title
  end
end

book = Book.new
book.title = "check"
puts book.title
# >> check

4 个答案:

答案 0 :(得分:8)

split(' ')生成一个临时数组。 map!改变了那个数组。然后它就消失了(因为它没有分配给任何东西)。

changed_title仍处于原始状态("check"),未发生变异。

这是一个修复:

class Book
  attr_reader :title
  def title=(changed_title)
    @title = changed_title.split(" ").map(&:capitalize).join(" ")
  end
end

book = Book.new
book.title = "check"
puts book.title
# >> Check

答案 1 :(得分:3)

或者做

def title=(changed_title)
  @title = changed_title.gsub(/\w+/, &:capitalize)
end

正则表达式匹配所有单词(准确地说是一个或多个单词字符)。 gsub用块的返回值替换所有出现的值,一次取一个匹配并将其大写。最后,该值将分配给@title

编辑 - 正如@SergioTulentsev所指出的,这会产生不同的结果,例如:最初在问题中使用的方法将产生:

  • "$hello""$hello"
  • "   foo  bar ""Foo Bar"

然而,本答案中提出的方法将产生:

  • "$hello""$Hello"
  • "   foo  bar ""   Foo  Bar "

答案 2 :(得分:2)

def title=(changed_title)
  @title = changed_title.split.map(&:capitalize).join(' ')
end

或者如果你使用rails

# require if not rails app
#require 'rails'
# or to not require all rails as @p11y suggested
#require 'active_support/core_ext/string/inflections'

def title=(changed_title)
  @title = changed_title.titleize
end

答案 3 :(得分:1)

a = "a big brown fox"
a = a.split.map(&:capitalize!).join(" ") #=> A Big Brown Fox