0

我不明白为什么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

4 回答 4

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
于 2013-10-22T08:29:34.703 回答
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 "
于 2013-10-22T08:35:42.340 回答
2
def title=(changed_title)
  @title = changed_title.split.map(&:capitalize).join(' ')
end

或者如果您使用导轨

# 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
于 2013-10-22T08:37:37.213 回答
1
a = "a big brown fox"
a = a.split.map(&:capitalize!).join(" ") #=> A Big Brown Fox
于 2013-10-22T08:41:39.720 回答