かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Ruby

defined?の使いどころ

Observableのコード読んでたらこんな風に使われてた。 module Observable def add_observer(obj) @observers = [] unless defined? @observers @observers << obj end def notify_observers *args @observers.each { |obs| obs.update(self, *args) } end en…

defined?

defined?演算子 演算子だったんだねこれって。効能 定義されてるかどうか調べてくれる 定義されてない場合はnil 定義されてる場合は種別を表す文字列を返す ほお。 実験!! こんなコードをば class A attr_accessor :name def public_method end private # …

RangeだRange

とりあえずコードだけ! Rangeとして使うにはsuccと演算子が使えないと駄目だ! class Hoge attr_reader :value def initialize value = 0 @value = value end def succ @value += 1 self end def <=>(other) @value <=> other.value end end h1 = Hoge.new …

成績表のノート

επιστημηさんのBlog東方算程譚にちょっとした問題のC++版、C#版があったのでRuby版を。 #学籍番号と得点(成績)の組: #record (7, 345), (8, 678), (1, 123), ... # #それと学籍番号の列: #target { 4, 5, 3, 1, 2 }; # #があるとき、targetを得点順にソート…

evalでクラス定義

たとえば、nameっていうプロパティを持ったクラスをいっぱい定義したいとすると… def define_class *args args.each do |name| eval <<-E class #{name} attr_accessor :name end E end endこんなメソッドを用意しておいて define_class( "Person", "Departm…

委譲してみよう

sendとmethod_missingをつかって委譲(丸投げ)するクラスを作ってみた。 Adapterパターンとかが簡単に出来そうだ。丸投げクラス class Marunage def initialize(target, map = {}) @target = target @map = map end def method_missing(method, *args, &blo…

メソッドを消す

undefを使ってメソッドを消せるらしい。 やってみる! class Hoge def method_missing obj, *args, &block puts "missing" end end h = Hoge.new puts h.to_s実行結果 #<Hoge:0x29383c0>ちゃんと出てる。これでto_sをundefすると class Hoge undef to_s def method_missing o</hoge:0x29383c0>…

moduleとclass

なんか一緒っぽい。 本にも、継承ツリーに入るみたいなこと書いてあった。 実験だ!! class Base attr_accessor :base def initialize base = "default base" puts "Base::initalize" self.base = base end end class Drived < Base def initialize super e…

暇つぶしにObserverパターンしてみる

class Observable def initialize super @observers = [] end def add_observer observer @observers.push observer end def notify *args @observers.each do |obs| obs.update(self, *args) end end def self.attr_notify_accessor *params params.each do…

ブロック!

メソッドの引数の最後に&つきの引数を定義するとブロックが入ってくる。 def hoge &block p block.class end puts "blockなし呼び出し" hoge puts "block有り呼び出し" hoge { }実行結果は blockなし呼び出し NilClass block有り呼び出し Procになる。 ふ〜…

可変長引数

いまさらって感じもあるけど可変長引数を… *をつければ可変長引数になる! def hoge *args p args end hoge 1, 2, 3実行結果は [1, 2, 3]

ブロック

ブロックは、本で斜め読みして使ってみただけで理解があさかったのでちょっと書いてみる。 ブロックを受け取るメソッドを作るのは簡単。普通に書けばOK def func puts "Hello world" end func { # block }実行結果 Hello world部通のメソッドでもブロックを…

ああああ〜〜!evalのメモ

eval 普通のeval instance_eval オブジェクト内部のコンテキストでeval class_eval/module_eval クラス/モジュール内部のコンテキストでeval

メタプログラミング

Railsによるメタプログラミングを読んでみた。 気になったところをメモ! 存在しないメソッドを呼んだときに呼ばれるメソッド method_missingというメソッドがそうらしい 早速実験 class Hoge def method_missing(method, *args, &block) puts "missing" end…

eval

久しく触ってなかったRuby。 ちょっとした事情で触ることに。 evalを使ってみました。文字列でrubyのプログラムを渡してやれば実行してくれる代物っぽい? 試しに eval "puts \"Hello world\""と書いて実行するとHello worldが出た。 ふむ attr_accessorみた…

Ruby CLR

rubyclrのgemをDLしてきて gem install ruby.... gem install text-formatこれで使えるようになる。requireとRubyClr::referenceとincludeをやると普通に使える。 require 'rubyclr' RubyClr::reference 'System' RubyClr::reference 'System.Drawing' RubyC…

めもめも

Module#attr

既存のクラスのメソッドを置き換えちゃう

タイトルみたいな事が出来るようだ。 どういう名前のつけられてる機能かは知らない!!! 早速やってみよう。 エラーが出るバージョンから s = nil s.hogenilに対してhogeメソッドを呼ぶ。 当然エラー! nilってのは、NilClassのインスタンスらしいので、Nil…

正規表現するわ

スクリプト言語の強みの1つ!正規表現。 早速やってみよう。 Regexpを使うようだ。早速!!! # 正規表現を用意して r = Regexp.new("^foo") # コンソールから読み込んで s = gets.chomp # マッチング if r.match(s) puts "マッチした" else puts "マッチし…

JRubyにしてみた

今までRubyのサイトからDLしてきたインタプリタ+RDEを使ってきたけど、これをJRuby + RDEにしてみた。 だってJavaが使えるんですから。RDEの設定でちょっと悩んだのが、ruby.exeへのパス。JRUBY_HOME\binの中に無いですから!! とりあえず、JRUBY_HOME\bin…

UnitTest

クラスと継承も出てきたので、ユニットテストに浮気。 使い方 require "test/unit" Test::Unit::TestCaseを継承 def test_***** というテストメソッドを定義 assert_equalとassert_instance_ofでテスト まず定義 require "test/unit" class TestHoge < Test:…

gemにproxy

gem install 何か -p http://proxy:8080

Ruby勉強二日目

実際二日目じゃないけど、ここに記述するのは二日目ってことで!!! クラスの定義 オブジェクト指向言語といえばクラスでしょう。 これが無きゃはじまらない!!!定義は class 名前 ここに色々 endでいける! 早速!!! サンプル クラスの定義 # クラス作…

勉強一日目

Hello World puts "Hello world" 標準入力 val = gets puts valこうも書けるみたい gets puts $_ p 人間にわかりやすく出力してくれるみたい p 5 p "こんにちは" p 10.4これを実行すると 5 "\202\261\202\361\202\311\202\277\202\315" 10.4oh 日本語わかり…

Rubyをはじめよう

事の発端 この間、「Excelに書いてあることを別Excelに貼り付ける」という作業を延々と数時間続けた。 元のExcelに書いてあるのが定型ならよかったんだけど、定型じゃないので微妙にしんどい。 見た目に拘って改行(セル内での改行じゃなくて行を変えてる)…