上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Rubyのsplitメソッドの挙動

splitメソッドは文字列を引数で指定された文字で分割して配列へ格納します。

"a,b,c".split(",") #=> ["a","b","c"]


引数無しだと、半角スペースや改行コード、タブで区切られるようです。
制御コードで区切られた文字を分割してくれるのかな?

スペース区切り "a b c".split() #=> ["a","b","c"]
改行(¥n)区切り "a¥nb¥nc".split() #=> ["a","b","c"]
改行(¥r)区切り "a¥rb¥rc".split() #=> ["a","b","c"]
改行(¥r¥n)区切り "a¥r¥nb¥r¥nc".split() #=> ["a","b","c"]
タブ区切り "a¥tb¥tc".split #=> ["a","b","c"]


そして、引数に空の文字列を渡すと1文字づつ区切られるようです。

"a b c".split("") #=> ["a"," ","b"," ","c"]
"a b c".split('') #=> ["a"," ","b"," ","c"]
"a b c".split(//) #=> ["a"," ","b"," ","c"]
"Hello".split("") #=> ["H","e","l","l","o"]


この挙動は試してないと想像しにくいかもしれません。

正規表現でn番目にマッチした文字を取り出す

以下の処理を行った後のn番目にマッチした文字$nはそれぞれどうなるか調べてみました。

>> /((a(bc))(d))/ =~ "abcd"
=> 0
>> $1
=> "abcd"
>> $2
=> "abc"
>> $3
=> "bc"
>> $4
=> "d"


abdc → abc → bc → dと、外側の括弧から順にマッチしているのが分かります。

ちなみにirbの場合、$0は「irb」になっていました。
$0はRubyコマンドの引数を示すもので、irbは実は「irb.rb」というRubyのプログラムなので、「irbを起動させること」=「ruby irb」と同じになるためと思われます。

Rubyのクラスメソッド(静的メソッド)

Rubyのクラスメソッドについて、イマイチよく分からなかったのですが、こちらのページの解説がかなり分かりやすかったです。
My BASE:Ruby/クラス

クラスメソッドとは「静的メソッド」とも呼ばれていて、定義する際にはそのクラス名か「self」をクラスメソッドのレシーバとして付ける必要があるようです。

class A
 def A.a
  puts "a"
 end

 def self.b
  puts "b"
 end
end
A.a #=> a
A.b #=> b
c = A.new
c.a #=> エラー(NoMethodError)
c.b #=> エラー(NoMethodError)


そのクラスから生成したインスタンスからは呼び出せないようですが、インスタンスを生成することなく呼ぶことができるので、関数的な使い方ができるのが特徴ですね、
クラスメソッドはそのクラスの外からでも定義可能なようです。

class A
end

def A.a
 puts "a"
end
A.a #=> a


そのクラスから生成したインスタンスからクラスメソッドを呼び出す方法はあるのかな?

Rubyの破壊的メソッド

Rubyには元のオブジェクトの内容も変更する「破壊的メソッド」と、変更しない「非破壊的メソッド」が存在します。
メソッドそのままで破壊的メソッドとなるものもありますが、メソッド名の最後に「!」が付くものも破壊的メソッドです。
そこで、String、Array、Hash各クラスでりようできるメソッドの中で「!」が付くメソッドをまとめてみました。

「Rubyは全てがオブジェクト」で書いたように、各クラスのメソッドを出力する「methods」メソッドを利用するとこんな感じです。

res = []
a = "" (Arrayクラス検証時:a = []、Hashクラス検証時:a = {})
# methodsメソッドの結果は配列なので、その配列をブロックで評価して、
#「!」を含むメソッドのみを抽出
a.methods.select{|x| x=~/!/}
p res


結果、以下のようになりました。

●Stringクラスで「!」の付くメソッド
["upcase!", "gsub!", "downcase!", "chop!", "capitalize!", "tr!", "chomp!", "swapcase!", "tr_s!", "succ!", "strip!", "delete!", "lstrip!", "squeeze!", "next!", "rstrip!", "slice!", "reverse!", "sub!"]

●Arrayクラスで「!」の付くメソッド
["map!", "shuffle!", "uniq!", "reject!", "compact!", "slice!", "sort!", "flatten!", "collect!", "reverse!"]

●Hashクラスで「!」の付くメソッド
["reject!", "merge!"]

●あと、各クラスで共通するprivateメソッドとして以下が出力されました。
["exit!", "chomp!", "sub!", "gsub!", "chop!"]

Integer●クラスにも一つありました
["power!"]
power!メソッドの動作を調べたところ、名前の通り「階乗」を算出するもののようですが、
a=2
a.power!(3) #=> 8
p a #=> 2
と、元の値は書き換えられていなかったので、この「!」は「破壊的メソッド」という意味ではないのかもしれません。

Ruby バージョン1.8.6の結果


こんな風にいろいろなことを手軽に調べられるのは面白いです。
「!」の付く破壊的メソッドが存在しているこれらのメソッドには、必ず「!」の付かない非破壊的メソッドが存在しているということになりますね。

※ただ、delete_ifなど、元から破壊的メソッドなものは、他の非破壊的メソッドとの区別が付かないため抽出できません。

Rubyのスコープについて1:ローカル変数とグローバル変数

スコープとは「ある変数がプログラムの中で参照可能な範囲」のことで、変数によってその範囲は異なります。

ローカル変数

●ブロックの外で宣言されたものは、ブロックの中でも有効
a = 1
1.times do
 puts a
end
#=> 1

●メソッドの外で宣言されたものは、メソッド内では無効
a = 1
def foo
 puts a
end
foo #=> エラー(NameError)

●メソッドの中で宣言されたものは、メソッド内、ブロック内で有効。メソッドの外では無効
def foo
 a = 1
 1.times do
  puts a
 end
 puts a
end
foo
#=> 1
#=> 1
puts a #=> エラー(NameError)

●ブロックパラメータとして宣言されたものは、そのブロックが終わるまで有効
1.times do |a|
end
puts a #=> エラー(NameError)

●宣言されていないローカル変数に対して、自己代入はできない
1.times do |a|
 x += a
end
puts x #=> エラー(NoMethodError:nilClassに'+'メソッドは定義されていないと表示される)

●ブロック内で宣言されたものは、そのブロックの終わりまで有効
2.times do
 puts defined?(a)
 a = 1
 puts a
end
#=> nil
#=> 1
#=> nil ※1回目で宣言されたaが2回目ではまた未宣言になっている
#=> 1
Rubyリファレンスマニュアル:変数と定数

●有効範囲内で宣言された変数は、同名のブロックパラメータの影響を受ける
a = 1
2.times do |a|
end
puts a #=> 2

●宣言を含む判定文は、実行されなくても宣言とみなされる
a = 1 if false # falseなので実行はされないが、aを宣言したことになる
1.times do
 puts a
end
#=> 1
Rubyリファレンスマニュアル:変数と定数



グローバル変数

●グローバル変数のスコープはプログラム全域
$a = 1
def foo
 1.times do
  puts $a
  $b = 2
 end
end
foo #=> 1
puts $b #=> 2

●未宣言のグローバル変数に代入してもエラーにならない
1.times do
 $a = 1
end
puts $a
#=> 1


PHPの場合、宣言していない変数に対して参照したり、自己代入してもエラーにはならないので、Rubyの方がこの辺りは厳格ですね。
プロフィール

星羽(榎田)

Author:星羽(榎田)
PHPエンジニアがRuby、PHPなどをいじった時の備忘録

最新記事
最新コメント
最新トラックバック
カテゴリ
スポンサードリンク
検索フォーム
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。