痔になりやすい生活習慣とは?

お世話になっております。
rubyのコーディングで疑問が発生しましたので、質問させてください。

以下の様にクラスを定義してあるとします
クラスA 体裁を整えて標準出力するクラス
 ・インスタンス変数@Aを持つ
 ・@Aを元に整形して標準出力する振る舞いを持つ
クラスB Aの子クラスで、標準出力する内容を細かく設定するクラス
 ・独自のインスタンス変数は持たない
 ・親クラスのインスタンス変数@Aを編集する振る舞いを持つ

上記の実装である時、クラスBの振る舞いでクラスAのインスタンス変数@Aを編集しようとした際にエラーが発生します。
尚、レシーバはsuperです。
エラー内容
./clsb.rb:49:in `edt_dsp': super: no superclass method `edt_dsp' (NoMethodE
rror)

エラー文中に出てる'edt_dsp'というメソッドが親クラスのインスタンス変数を編集するメソッドです。
尚、子クラスには独自の変数は無いのでinitializeメソッドは定義していません。
なぜこのようなエラーが発生してしまうのかわからず困っています。
現在自分でも色々とサイトを回って調べていますが、解決には至っていません。
ご回答いただければ幸いです。
以上です。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

インスタンス変数 @a は、インスタンス(オブジェクト)に付随したもので、祖先・子孫クラスでも共通です。


クラス定義Aの中で現れるインスタンス@aと、子クラス定義Bの中で現れるインスタンス変数@aが別物と誤解されているようですが、違います。同じオブジェクトであれば同じものです。

従って、@a でアクセスします。

ちなみに、super.a とかくと、「親の同名メソッドを呼び出して、その結果のオブジェクトのメソッドaを呼び出す」という文法上正当な表現ではありますが、やりたいこととは全く違います。
    • good
    • 0
この回答へのお礼

お世話になっております。
notnotさん、回答ありがとうございます。
教えていただいた事を踏まえてソースを整理して、
解決に至る事ができました。
ありがとうございました。

それから、前回補足投稿させていただいた中に、
コンパイラ云々と書いていましたが、IDEです。
インタプリタのRubyを使っているのに、頓珍漢な事を言って混乱させてしまっていたら、すみません。

お礼日時:2009/11/06 17:40

>尚、レシーバはsuperです。



これが引っかかりますね。super とは、親クラスの同名のメソッドを呼び出すキーワードなので、「レシーバはsuperです」は意味不明の文章です。

>./clsb.rb:49:in `edt_dsp': super: no superclass method `edt_dsp' (NoMethodE
rror)

というのは、「クラスBのメソッドedt_dspの中で、superと書かれていたので親クラスの同名メソッドを呼び出そうとしたが、親クラスAではメソッドedt_dspは定義されていない」というエラーですね。

実際、定義されて無さそうなので、superと書いたのが間違いでは?何をしたくてsuperと書いたのですか?

この回答への補足

お世話になっております。
JAVA等では子から親に定義されているメンバ変数aにアクセスする際は、
super.aと記述した様に記憶しています。
rubyでも同様の記法でコンパイルが通ったので、出来るのかなとやってみた次第ですが、同様の動作は期待出来ないのでしょうか。

補足日時:2009/11/05 08:39
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q英語で「個数」「件数」は?

質問は単純です。
英語で「個数」や「件数」をなんというか、です。

とりあえず、思いついたのは、numberでした。
たとえば、「りんごの個数」は"a number of apples"ですか?
でも、"a number of"は「いくつかの」という意味ですよね。

「データの件数」は"a number of data"でしょうか?

私は英語はほとんど出来ませんが、numberは「個数」というよりも「番号」という意味であるような気がしてなりません。

Aベストアンサー

>「個数」や「件数」をなんというか、です。
>とりあえず、思いついたのは、numberでした。
意外に思われるかもしれまんせんが、語の選択はnumberであっています、と思います。

>「りんごの個数」
the number of (the) apples

>「データの件数」
the number of (the) data

>numberは「個数」というよりも「番号」という意味であるような気がしてなりません。
実は、昔、私も、「個数や件数はなんていうのかな、え、number? え、本当?」と、奇異に感じたことを、思い出しました。

Qインスタンス内から自分のクラス名を取得する方法

クラスインスタンス内から自分のクラス名を取得しようと思うと、self.class.nameで取得できますが、type.nameでも取得できます。
しかし、typeは非推奨メソッドとなっているため、警告が出て、このままでは使用することができません。

素直にself.classを使えばいいのかもしれませんが、selfのワンクッションがどうにも気に入りません。

スマートな記述方法あったら教えて下さい。

# self.class.nameを使用する場合
class MyClass
 def print_classname
  puts self.class.name
  # puts class.name これはエラー
 end
end

# type.nameを使用する場合
class MyClass2
 def print_classname
  puts type.name # これはdeprecatedの記述で警告が出る
 end
end

Aベストアンサー

self を書きたくないということなら、
alias :xclass :class
しておいて、
xclass.name
するくらいしかないと思います。スマートとは思いませんけど。

逆に、インスタンスメソッド定義の中で、class以外のメソッド呼び出しの時もselfを省略しないで書くことにすれば、全部統一が取れます。

Qリンクをクリックした時にformからPOST送信したい。

HTML、PHP、JavaScript等でサイトを作っているのですが・・・。

【実現出来ている例】
<form name="form1" method="post" action="Next.php" onSubmit="return InputCheck()">
 <input type="submit" value="送信">
</form>
 submitボタンを一つ置いて、それがクリックされた場合に
formの内容をPOSTで送信する。

【実現したい例】
<form name="form1 method="post">
 <a href="Next.php" onClick="???">???</a>
</form>
 formの中のリンクをクリックされた場合に、formの内容を
POSTで送信したいのですが、その実現方法がわかりません。
GETで送るという手もあり得ますが、今回はどうしてもPOST
したいのですが。

Aベストアンサー

<form name="form1" method="post" action="Next.php">
<a href="#" onClick="document.form1.submit();">???</a>
</form>

onclick内の対象がform1としてあてているので、
アンカータグは別にform内に記述しなくても大丈夫です

form内にhidden等でnameとvalueを持ったパラメータがあればそれも送られます

アンカータグから動的にvalueを変更したい場合は、
document.form1.hogename.value = 'hoge';
等をsubmit()の前に行えば可能です

ただしform内に
<input type="hidden" name="hogename" value="">
を記述する等、変更先パラメータの元を用意する必要がありますのでご注意下さい

QPostgreSQLが起動しない・・・

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not write lock file "/var/lib/postgres/data/postmaster.pid": No space

となっており、上記ディレクトリにpostmaster.pid書き込みできないよ、と言われているっぽかったので、パーミッションを変更したりして
みましたが、postgresql startにしろ、pg_ctl startにしろ、それぞれのコマンドで起動すると、強制的にパーミッションが「700」に変更されてしまうようで、結果は同じでした。

どなたか、解決策をご教示願えませんでしょうか?

よろしくお願いします。m(_ _)m

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not wri...続きを読む

Aベストアンサー

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証はなし。)

su - postgres

上記のコマンドでログインするなり、パスワードを忘れたのならroot権限にてpasswdコマンドから変更するなりした後、もう一度postmasterを起動してみよう!

ちなみに、パーミッション関係のエラーは、「Permission denied」ですよね。

参考URL:http://www.postgresql.jp/document/pg803doc/html/postmaster-start.html

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証は...続きを読む

QrubyでC言語のexitにあたる構文は?

現在、C言語のプログラムをrubyに書き換えています。

そこで、C言語のexitに当たるrubyの構文、もしくは、
文法が見つからず、困ってます。
(ある条件になったら、強制的にrubyの実行を
 停止させたいのですが、、、)
(__END__ですか?)

詳しい方が居ましたら、ご指南下さい。

Aベストアンサー

#2です。
>exit のあとの数字について詳しく知らないので、
>教えていただけたら幸いです。
exitのあとの数字は終了コードといって、どのような状態で、このプログラムが終了したかを、呼び出しもとに伝える為のものです。
この値は、呼び出し元と、呼び出される側(このプログラム)との決め毎なので、どのようにきめてもかまわないのですが、
ふつうは、終了コード:0で終了したときが、正常終了にします。
それ以外の値は、異常終了を示す値にします。

この終了コードは、なにかのサブルーチンを作ったときの、戻り値に似ています。
サブルーチンの戻り値は、呼び出しもとと呼び出される側(サブルーチン側)とで、自由にきめて良いのですが、
通常は、正常:0、以外は、それなりの異常にしますよね。

Qcssで「下よせ」ってどうやっていますか?

フロートのレフト、ライトはいいとして、

あるボックス要素内(A)に異なるボックス要素(B)をいれます。
この(B)を(A)の一番そこにはりつかせたい時にどうすれば
最もよいのでしょうか?

いいアイデアをご教授ください。

Aベストアンサー

こんなのはどうかな?

position: absolute;
bottom: 0px;

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。

QRubyでハッシュの中の値からキーを取りだしたい

ハッシュの中の値からキーを取りだしたいのですが、うまくいきません。
下記のようなソースしか思い浮かばないのですが、
何か良い手はないでしょうか。

-------
if number == ban.values
d = ban.keys
end

Aベストアンサー

お使いになっているRubyのバージョンは何でしょうか。
オーム社のプログラミングRuby 1.9 ライブラリ編にも例が載っています。
h = { "a" => 100, "b" => 200, "c" => 300 }
s = h.select { | k, v | v == 200 } # {"b"=>200}
p s.values[0] # 200

になるはずなんですが。
http://ref.xaio.jp/ruby/classes/hash/select

QRuby 改行文字の挿入

こんにちは。
Rubyの質問です。
htmlの文章にrubyで改行文字を挿入してそれを認識させたいのですが、
htmlの文章内に¥nを挿入しても読み込んだ際にうまく認識してくれませんでした。

何か他に方法があるのでしょうか。
ご教授の程よろしくお願い致します。

Aベストアンサー

どのようにして\nを挿入したのか、不明ですが、エディタを使用して行った前提で回答です。
改行コードを埋め込む場合は、\nを挿入したい位置で、Enterキーを押下してください。
それで、見かけ上、2行になれば、そこに改行コードが埋めこまれたことになります。

尚、通常は\nの文字そのものは、\とnの2文字にすぎません。
ruby のスクリプトでそれを"\n"のようにダブルクオートでくくった場合、それをrubyが改行コードとして扱う
という特別の約束があります。

ですので、エディタで行なう場合は、実際の改行コードを埋め込まないといけません。


人気Q&Aランキング