by shigemk2

当面は技術的なことしか書かない

Ruby初級者向けレッスン 第41回 by ひがきさん

rubyの文字列について
スピーカー ひがきまさる

  • リテラル
  • エンコーディング
  • 順序
  • 比較
  • 数え上げ
  • mutable

文字列の作りかた

String.new # => ""
String.new("ruby") # => "ruby"
1.to_s # => "1"
[1, 2, 3].to_s # => "[1, 2, 3]"
"Ruby関西" # => "Ruby関西"
'文字列に"を含む' # => "文字列に \" を含む"
%|' も " も含む| # => "' も " も 含む"

式展開

"#{name}さん(#{age})"
'#{name}さん(#{age})"

シングルクォートは"とかも文字列として見做す

エンコーディング

# -*- conding: utf-8; -*-
e = s.encode(Endoding::EUC_JP)
e.encoding

文字列はそれぞれエンコードを持っている
そしてencodingメソッドでエンコードで指定出来る。
また、1行目でエンコードを指定しないといけない
Encoding.listでエンコードを羅列できる
また、外部エンコーディングと内部エンコーディングが存在する

__ENCODING__ スクリプトのエンコーディング

順序

["Ruby", "Java", "C", "Lisp"].sort
"a".succ.succ # => "c"
"z".succ # => "aa"
"Ruby".succ # => "Rubz"

比較

# true
"Ruby" == "Ruby"
"Ruby" === "Ruby"
# 真偽値判定メソッドは?をつけることが多い
"Ruby".eql? "Ruby"
# false
# オブジェクト比較メソッド
"Ruby".equal? "Ruby"
# 0 (多言語でいうところのfalse)
# 正規表現を利用する比較
"Ruby" =~ /ruby/i

注意
エンコーディングが違うと比較してもfalseになってしまう

数え上げ

# "R"
"Ruby"[0] 
# "u"
"Ruby"[1]
# "y"
"Ruby"[-1]
# "ub"
"Ruby関西"[1, 2]
# "y関"
"Ruby関西"[3.-2]

each_byteとかブロックを使うことのも可能

破壊(オブジェクトの変更)

s = "ruby"
s.upcae
# "ruby"
p s
t = s
t.upcae!
# "RUBY"
p s

オブジェクトのコピー = 変数
t = sとかやると、同じオブジェクトを指している
破壊的メソッドの使用には注意を要する

メソッドの結果を別の変数に格納すれば t と s は
別のオブジェクトを参考出来る

  • 型キャストしてからの比較
  • キャストしない比較
  • オブジェクトを比較する