2006-12-01から1ヶ月間の記事一覧

ダウンロードして読めるRubyの入門書(英語)

http://www.humblelittlerubybook.com/ via Matzさんち

tech addict - ruby gotchas and caveats

http://www.rubyist.net/~matz/20061220.html#p01 メモ。「特異クラスも「格納場所」の対象になる」ように変更。

るびこさんは何を見ながらRubyの勉強をしていますか?

この日記を見ている読者さんから「るびこさんは何を見ながらRubyの勉強をしていますか?」という質問をいただきました。 ええと、普通にriやrefeを使ってマニュアルを読んだり、Ruby Cookbookを読んだり、『オブジェクト指向スクリプト言語Ruby』を読んだり…

mathn

mathnモジュールを使うと、Integerの / で割り切れないとき、自動的に結果がRationalになります。つまり、こういうことです。 p 4/2 #=> 2 p 1/2 #=> 0 require 'mathn' p 4/2 #=> 2 p 1/2 #=> 1/2 クラスを調べてみましょう。 p (4/2).class #=> Fixnum p (…

疑問:特異クラスの構文の不思議

Rubyの特異クラスは以下のように書きます。 class <<obj # ... end ここで、"インスタンスに固有なクラス」を仮想的に指定しています。これが特異クラスです。 ところで、どうして " たとえば、Rubyでは、クラスの継承関係は"Child 継承関係と、クラス・インスタンスの関係は別なので、継承関係は "インスタンスの関係は "インスタンス" よりも "インスタンス 特異クラスには名前がないのですが、仮にεと書くと、 class ε >> obj # ... end のように書くのが自然ではないかな、と思いました。ここでεを省略すると、 class >>obj # ... en…</obj>

修正の容易さ

Rubyでは、システムに組み込まれているクラスに対しても、メソッドを追加したり、修正したりできます。これは非常に強力であると同時に、危険でもありますね(危険であると同時に、非常に強力でもあります)。 プログラマを信頼している言語、と言ったらちょ…

if-elseではまりました

Rubyで5分ほどはまってしまったプログラム(のエッセンス抽出)。以下のプログラムはなぜCを表示するか? a = false b = true if a puts "A" elseif b puts "B" else puts "C" end #=> C正しくは以下。 a = false b = true if a puts "A" elsif b puts "B" e…

疑問:シングルトンメソッドのaliasはどうする?→解決:特異クラスを使う

Rubyco.helloをRubyco.xxx_helloとして呼ぶようなaliasを作るときにはどうすればよいのでしょう? class Rubyco def self.hello puts "Hello" end alias :xxx_hello :hello # undefined method `hello' for class `Rubyco' end 追記:kjanaさんに教えていた…

特異クラスの特異クラス

特異クラスの定義中にselfをグローバル変数に保存して、「特異クラスの特異クラスの…」を繰り返してみたくなりました。スーパークラスをたどるようにどこかでルートにたどり着くのでしょうか(わざとらしい問いかけ)。 class Rubyco end $obj = Rubyco 1.up…

make_rangeを作る

弾さんのfor(1..1e10) と Iteratorを読んで、make_rangeをRubyで書いてみました。 def make_range(now, limit) lambda { now <= limit ? (now += 1) - 1 : nil } end sum = 0 # r = make_range(1, 1e7) r = make_range(1, 1000000) # 1e7だと終わらなかった…

フリップフロップ

フリップフロップをRubyでやろうと思ったのですが、何だか汚くなってしまいました。 DATA.each do |s| if /^3/.match(s)../^5/.match(s) puts s end end __END__ 1111111111 2222222222 3333333333 4444444444 5555555555 6666666666 7777777777 8888888888 …

パスワードの強度

奥村先生のパスワード再考というエントリを読んで、パスワードの強度をビット長で表すプログラムをRubyで書いてみました。 # Base 2 logarithm module Math def self.log2(n) log(n) / log(2) end end # Bit length def password_strength_by_bits(ary, leng…

グレイコード

何となくグレイコードを出力したくなって。 0.upto(31) do |k| printf "%05b\n", k ^ (k >> 1) end 実行結果です。 00000 00001 00011 00010 00110 00111 00101 00100 01100 01101 01111 01110 01010 01011 01001 01000 11000 11001 11011 11010 11110 11111…

演算子を明示的にメソッド呼び出し

演算子をメソッドっぽく呼び出せます。 p 2.+(3) #=> 5 括弧を付けないと警告が出ます。 p 2.+ 3 # warning: parenthesize argument(s) for future version うーん、シンタックス・ハイライト便利! はてなの中の人、GJ!

ディオファントス

コマネチ大学数学科30講:ディオファントスを読んで、大変手抜きな調べ方をしてみました。 立方体で直方体を作り、外側の面に色をつけたとき、色がついた面とついていない面の数が同じになるのは、どのような直方体か答えなさい # 2(xy + yz + zx) = 3xyz wh…

スーパーpreでシンタックス・ハイライト

# 2(xy + yz + zx) = 3xyz where x, y, z : positive integer (1..10).each do |x| (x..10).each do |y| (y..10).each do |z| if x != y or y != z or z != x then if 2 * (x * y + y * z + z * x) == 3 * x * y * z then puts "(x, y, z) = (#{x}, #{y}, #{…

実行文

よく思うんですけれど、Rubyのプログラムを読むとき(あるいは文法を理解するとき、でもよいですが)、「classもdefも実行文」と思うととてもよく理解できますね。一見宣言のように見えるけれど、実は全部evalしてるだけじゃん、みたいな。Lispのシンタクス…

インスタンス変数とアクセサ

attr_readerで、インスタンス変数を読むメソッドが自動的に定義されます。attr_accessorでインスタンス変数へ代入するメソッドも定義されます。 class Person def initialize(name, mail) @name, @mail = name, mail end end alice = Person.new("Alice", "a…

String#[]に正規表現を渡す

Rubyでは、String#[]に正規表現を渡すと、マッチした部分文字列を返します。 s = "We wish you a Merry Christmas!" p s[/C\w+mas/] #=> "Christmas"

Marshal

Rubyでは、Marshal.dumpでオブジェクトのマーシャリング(シリアライゼーション)ができます。できた文字列(マーシャルデータ)はMarshal.loadで元に戻すことができます。詳しくはrefe Marshal.dumpおよびrefe Marshal.loadを参照。 a = [1, 2, { 'Alice' =…

Net::HTTP

Net::HTTP.getを使うと、Webページを簡単に取得できます。 以下の例では、http://www.hyuki.com/のページを取得して、タイトルを正規表現で抜き出して表示します。 require 'net/http' s = Net::HTTP.get(URI.parse("http://www.hyuki.com/")) puts s[%r{<title>.*?</title>…

時刻文字列の書式指定

strftimeを使うと、日時を書式指定して文字列化できます。 t = Time.gm(2006, 1, 2, 3, 4, 5) p t.strftime("%Y-%m-%d %H:%M:%S") #=> "2006-01-02 03:04:05" p t.strftime("%Y%m%d%H%M%S") #=> "20060102030405"iso8601なども面白い。 require 'time' t = T…

flattenせずに配列探索

配列をflattenせずに再帰的に探索するメソッドを書いてみました。でもあまり格好良くありません。 a = [ 1, 2, 3, [4, 5, 6], [7, [8, 9, 10]]] class Array def recurse_find(x) self.each do |item| if item == x return true elsif item.is_a?(Enumerable…

\C-a

Rubyで\C-aと書くとCTRL+Aを表す。\C-Aと書いてもよい。はじめに?をつけると文字リテラル。 p ?\C-a == ?\C-A #=> true p "\C-a"[0] == ?\C-A #=> true p "\x1"[0] == ?\C-A #=> true p "\x1" == "\C-A" #=> true

String#each_byteとString#scanの違い

String#each_byteだと、Fixnumとして各文字を切り出しますが、scanはStringとして切り出します。 s = "Rubyco!" s.each_byte do |x| puts "#{x} (#{x.class})" end s.scan(/./) do |c| puts "#{c} (#{c.class})" end実行結果です。 82 (Fixnum) 117 (Fixnum)…

単語の頻度を調べる

class String def words(pattern=/\w+/) hash = Hash.new(0) self.scan pattern do |w| hash[w] += 1 end hash end end s = <<"EOD" We wish you a Merry Christmas, We wish you a Merry Christmas, We wish you a Merry Christmas, and A Happy New Year! …

superを使わずにスーパークラスのメソッドを呼び出す

サブクラスから自身がオーバーライドしたスーパークラスのメソッドを呼びたいときを読んで、私もやってみました。 class Mother def hello puts "Mother#hello" end end class Rubyco < Mother alias :xxx_hello :hello def hello puts "Rubyco#hello" end d…