2008年7月18日

[ruby-list:45235] Re: Matrixのサブクラスのインスタンス生成

From: "M.Uemura" <mitsuhideuemura@xxxxx>
Subject: [ruby-list:45234] Matrix のサブクラスのインスタンス生成
Date: Fri, 18 Jul 2008 00:41:44 +0900

るびきちです。

> 頑張っているところなのですが、Matrix のサブクラスを定義しようとして、
> はまっております。


残念ながら、Matrixはサブクラスを作成できるようには作られていません。

> #"ruby -w" を受け取ってくれる env と "No such file" と弾いちゃう env
> #があるけれど、違いは何なのだろう。。。

envの問題ではなくて、#!の解釈の問題です。
一部の環境では 「#! /bin/env ruby -w」を「/bin/env」と「ruby -w」に解釈してしまい、
/bin/envの引数に「ruby -w」が渡されます。
そのため、「ruby -w」(スペースつきのコマンド)を探そうとして見つからないと言われてしまいます。

他にもいろいろな解釈の方法があるようです。
http://www.jmuk.org/diary/2007/03/01/0
http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0

> class MyMatrix < Matrix
> attr_accessor :fixed
> def initialize
> super
> @fixed = false
> end
> end

Matrix#initializeは引数を取るのでこれではだめです。

require 'matrix'

class MyMatrix < Matrix
attr_accessor :fixed
def initialize(*args)
super
@fixed = false
end
end

mtrx = MyMatrix.zero(3) # => Matrix[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
mtrx.class # => Matrix

mtrx = Matrix[[11, 12], [21, 22]] # => Matrix[[11, 12], [21, 22]]
mtrx.class # => Matrix
mtrx = MyMatrix[[11, 12], [21, 22]] # => Matrix[[11, 12], [21, 22]]
mtrx.class # => MyMatrix
rows = [[1, 0], [0, 1]]
mtrx = MyMatrix.rows(rows, true) # => Matrix[[1, 0], [0, 1]]
mtrx.class # => MyMatrix

MyMatrixのインスタンスが生成されてても「Matrix[行列の内容]」と表示されているのは、
あくまでMatrix#inspectがそう定義されているためです。

Matrix.zeroは次のように定義されているため、MyMatrixのインスタンスは生成されません。
たとえサブクラスから呼ばれても無理矢理Matrixのインスタンスを作成します。

def Matrix.zero(n)
Matrix.scalar(n, 0)
end

一方、Matrix.[]は次のように定義されているため(Matrixが出てこない)、MyMatrixの
インスタンスが生成されます。

def Matrix.[](*rows)
new(:init_rows, rows, false)
end

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/


投稿者 xml-rpc : 2008年7月18日 04:17
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/75458
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。