投稿

10月, 2008の投稿を表示しています

Ruby 文字化け(ダメ文字を回避せよ)

Windows 上で SJIS を使用している場合、ruby -Ksを、 UNIX 系 OS 上で EUC を使用している場合、ruby -Keを UTF-8N を使用している場合、ruby -Kuを指定する必要があります。 だそうです。 #! ruby -Ks

Ruby アクセスレベル

initializeメソッドを除き、クラス内のメソッド等はpublicである。 通常、宣言は省略されているが、明示的に宣言することもできる。 class A def hoge puts "public Aクラスのhoge" end public :hoge end AA = A.new AA.hoge # 結果 # Aクラスのhoge(public) privateなアクセスレベルを与えたい時は明示的に宣言する。 class A def hoge puts "Aクラスのhoge(public)" end public :hoge def hoge2 puts "Aクラスのhoge2(private)" end private :hoge2 end AA = A.new AA.hoge AA.hoge2 # 結果 # Aクラスのhoge(public) # hoge2へはアクセスできない(private method `hoge2' called)

Ruby 特異メソッド

Ruby特有の挙動として、特異メソッドというものがあるらしい。 # 特異メソッドの例 foo = "ミスターFOO" def foo.say(name) puts self + "「こんにちは#{name}」" end foo.say("子猫ちゃん") # 結果 # ミスターFOO「こんにちは子猫ちゃん」 上記の例では、"foo"というオブジェクトに対してメソッドを定義している。 通常、あるメソッドを追加したいという場合にはクラスに新しくメソッドを追加するのだが、この特異メソッドを使用することで、特定のオブジェクトだけのメソッドを作ることができる。 クラスのインスタンスから特異メソッドを作る # 通常のクラス定義 class A def hoge puts "ほげほげ" end end AA = A.new AA.hoge # クラスのインスタンスから特異メソッドを追加 def AA.voice(name) puts "#{name}「ポウ!」" end AA.voice("ミスターHOGE") # 結果 # ほげほげ # ミスターHOGE「ポウ!」 クラスのインスタンスに対しての特異メソッドは、 使いどころによっては便利なこともあるかもしれない。

Ruby 変数とスコープ

グローバル変数 $をつけたもの。 どこからでも参照できる、なんでもアリな変数。 一見便利であるが、多用するとどこで値が変わっているかわからないコードになってしまう。 $var = "グローバルhoge" class A def hoge puts $var end end cls = A.new cls.hoge # 結果 # グローバルhoge クラス変数 クラス、およびそのクラスのインスタンスすべてで参照できる変数。 class A @@ClassHoge = "クラス変数hoge" def hoge puts "Aクラスのhoge" end end class B < A def hoge puts @@ClassHoge end end cls = B.new cls.hoge # 結果 # クラス変数hoge 上記の例では、Aを継承したBクラスからAのクラス変数を参照している。 これも多用するとソースの見通しが悪くなりそうな感じで、 使用はベースクラスのみにとどめておいたほうが良さそうな感じ。 インスタンス変数 インスタンス毎に別の値を持つ変数。 インスタンスを生成した時点では nil となる。 class A @InstanceHoge = "クラス変数hoge" def hoge puts "Aクラスのhoge" end end class B < A def hoge puts @InstanceHoge end end class C < A def hoge @InstanceHoge = "書き換えたhoge!" puts @InstanceHoge end end BB = B.new BB.hoge CC = C.new CC.hoge # 結果 # nil # 書き換えたhoge! ローカル変数 メソッド内で使用される通常の変数。 class A def hoge foo = "ローカル変数" puts foo end end

Ruby クラスの継承とオーバーライド

Rubyはオブジェクト指向言語であるから、当然のことながらクラスの継承ができる。また、継承した子クラスから親クラスのメソッドをオーバーライドすることもできる。 class A def hoge puts "Aクラスのhoge" end end class B < A def hoge puts "Bクラスのhoge" end end cls = B.new cls.hoge # 結果 # Bクラスのhoge ここまでは通常の継承とオーバーライドである。 しかし、Rubyではオーバーライドするメソッドに super を入れると、オーバーライド元のメソッドを実行することができる。これは面白い挙動だ。 class A def hoge puts "Aクラスのhoge" end end class B < A def hoge super puts "Bクラスのhoge" end end cls = B.new cls.hoge # 結果 # Aクラスのhoge # Bクラスのhoge super は、いつでも呼び出すことができるうえ、何度も呼び出すことができる。 ちなみに、オーバーロードはないらしい。

Rubyの破壊的メソッド

Rubyには"破壊的メソッド"というものがある。 調べてみると、「オブジェクトそのものを書き換えてしまうもの」らしい。 例) 文字列の空白を除去 s = " もじれつ" puts s # もじれつ #通常のメソッド s = " もじれつ" s = s.strip puts s #もじれつ # 破壊的メソッド s = " もじれつ" s.strip! puts s #もじれつ 破壊的メソッドの場合は「s = s.strip!」と表記しなくても、 そのままオブジェクトが書き換えられてしまう。 s.strip!だけでオブジェクトの中身が入れ替わってしまうので、 他の言語と比べると不思議な感覚がある。

数値のカスタム書式変更

int i = 1234; // 01234 (0でPadLeftと同じ) Console.WriteLine(i.ToString("00000")); // 1234 Console.WriteLine(i.ToString("#####")); // 1,234 Console.WriteLine(i.ToString("##,###")); // 12234: プラス1234 // -1234: マイナス1234 // 0: ゼロ Console.WriteLine(i.ToString("プラス#;マイナス#;ゼロ")); // 12234: +1234 // -1234: -1234 // 0: 0 Console.WriteLine(i.ToString("+#;-#;0")); // 数値1234 Console.WriteLine(i.ToString("数値: #"));

リテラル

VB.NETにおいても明示的に型を指定する際には必須。 特に忘れそうなもの。 Decimal : 0.1D, 0.1M Char : "a"c, 'a'