[llfuture]Rubyでtitleメソッド作った

浜地さん(id:shinichiro_h)が LL futureのキミならどう書く? LL Golfのイベント中に
「(略)PythonのStringにtitle()とistitle()というメソッドがあって大変、ショックを受けた(略)」
みたいな事をおっしゃっていました。


Rubyにはcapitalizeというメソッドがあるけど、ちょっとばかり挙動が違うので
すぐに"本当のタイトル"を作れないし、タイトルかどうかが一発で判断できないし残念!


と、言う訳でtitleメソッドを作ってみました。
Rubyらしくメソッド名は title と title! と title? にしてみました。
これで文字列がタイトルかどうかの判別が一瞬でできてこれは便利!
自由に使ってね!

# ruby_string_title.rb
class String
  def title
    ret = self.downcase
    c = /[a-z]/ =~ ret
    return ret unless c

    ret[c] = ret[c..c].upcase
    ret
  end
  def title!
    self.replace title
  end 
  def title?
    return false unless /[A-Z]/ =~ self
    return self == self.title
  end
end


上記スクリプトruby_string_title.rb とした場合、
テストは適当にこんな感じです。

require 'test/unit'
require 'ruby_string_title.rb'

class StringTitle < Test::Unit::TestCase
  def test_title
    assert_equal "Title" , "Title".title

    assert_equal "Title" , "title".title
    assert_equal "Title" , "tiTle".title

    assert_equal "Title " , "title ".title
    assert_equal "Title0" , "title0".title

    assert_equal "1.1 Title " , "1.1 titlE ".title
    assert_equal "これはTestです" , "これはteStです".title

    assert_equal " " , " ".title
  end

  def test_title!
    assert_equal "Title" , "Title".title!;self

    assert_equal "Title" , "title".title!;self
    assert_equal "Title" , "tiTle".title!;self

    assert_equal "Title " , "title ".title!;self
    assert_equal "Title0" , "title0".title!;self

    assert_equal "1.1 Title " , "1.1 titlE ".title!;self
    assert_equal "これはTestです" , "これはteStです".title!;self

    assert_equal " " , " ".title!;self
  end

  def test_title?
    assert_equal true , "Title".title?

    assert_equal true , "Title 0 ".title?
    assert_equal true , "1.1 Title ".title?
    assert_equal true , "これはTestです".title?

    assert_equal false , "title".title?
    assert_equal false , "TITLE".title?
    assert_equal false , "tiTle".title?
    assert_equal false , "title0".title?
    assert_equal false , "1.1 titlE ".title?
    assert_equal false , "これはtestです".title?
    assert_equal false , " ".title?
  end
end