[#39325] File.fnmatch の改良について — "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>

はじめまして、山本です。

18 messages 2004/03/05

[#39429] trial version of Ruby/Tk — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

18 messages 2004/03/23
[#39454] Re: trial version of Ruby/Tk — "Shirai,Kaoru" <shirai@...> 2004/03/31

白井です。

[#39460] Re: trial version of Ruby/Tk — Hidetoshi NAGAI <nagai@...> 2004/04/01

永井@知能.九工大です.

[#39465] Re: trial version of Ruby/Tk — "Shirai,Kaoru" <shirai@...> 2004/04/01

白井です。

[#39466] Re: trial version of Ruby/Tk — Hidetoshi NAGAI <nagai@...> 2004/04/01

永井@知能.九工大です.

[#39453] Re: int/int in Ruby2? — Masaaki Sakano <mas@...>

坂野 正明です。

36 messages 2004/03/31
[#39455] Re: int/int in Ruby2? — NISHIMATSU Takeshi <t-nissie@...> 2004/03/31

西松と申します.

[#39470] Re: int/int in Ruby2? — Masaaki Sakano <mas@...> 2004/04/01

坂野 正明です。

[#39473] Re: int/int in Ruby2? — matz@... (Yukihiro Matsumoto) 2004/04/01

まつもと ゆきひろです

[#39484] Re: int/int in Ruby2? — Masaaki Sakano <mas@...> 2004/04/03

坂野 正明です。

[#39528] Re: int/int in Ruby2? — "T Akutsu" <locrian@...> 2004/04/09

あくつです。なんかわくわくしてきだぞ。(^^;)

[ruby-list:39416] Re: rubyの関数定義について

From: Makoto Kuwata <kwa@...>
Date: 2004-03-21 19:57:57 UTC
List: ruby-list #39416
桑田といいます。
ストレスを感じる原因のひとつは、Rubyにおける関数定義の仕組みがわからない
ことではないかと思います。

---

Rubyや他のスクリプト言語は、インタプリタといえど内部でいったんコンパイル
してから実行されます。

Step1. プログラムを構文解析し、抽象構文木(やバイトコード)にコンパイルする。
Step2. 抽象構文木(やバイトコード)を解釈して実行する。

ここで関数定義があった場合、Perlや他の言語では Step1 の段階で関数が定義
されます。そのため、うしろのほうに関数定義があっても Step2 は問題なく
実行できます。
しかしRubyの場合は Step2 にならないと関数が定義されません。
そのため、プログラムのうしろのほうに関数定義を置くことができません。

例えば次のようなプログラムがあるとします。

   if false then	# 必ず偽
     def func1()
        return 0
     end
   end

Perlなどでは、このプログラムが構文解析された段階で必ず func1() が定義
されます(構文エラーでなければ)。
しかしRubyの場合は、この例だと関数定義文が実行されませんので、関数が
定義されません。

このような仕組みのため、Rubyでは関数を使うよりまえに関数定義が文として
実行されてないといけない、つまりうしろのほうに関数定義を置くことができない
というわけです。
同じ理由で、クラス定義もうしろのほうに置くことはできません。

#たぶんこの説明であってると思いますが、間違っていたらご指摘ください>皆様

このような仕組みに違和感を感じるかもしれませんが、条件に応じて実行時に
関数定義を変えることができるなど、大変強力な仕組みでもあります。
関数を先に定義しなければならなという制限は、その強力さとのトレードオフだと
ご理解ください。


まあCなどに慣れた方なら、メインの処理を先にもってきたいという気持ちは
よくわかります。
ただ逆にいえば、Rubyでメイン処理を見つけようと思ったらまず後ろのほうを
みればいいだけ、ともいえます。
特に if __FILE__ == $0 があればメイン処理の場所が一発でわかりますし、
慣れれば実はどうってことない問題だと思います(自分がそうでした)。

あと、Cのような手続き型言語では処理を順番に追っていくことが大事ですが、
Rubyのようなオブジェクト指向言語ではメッセージパッシングというか
オブジェクトの相関関係が大事になります。そのため、処理の順序というのは
(メソッドの中を除くと)あまり重要視されないんじゃないでしょうか。
いや重要視されないわけじゃないんですが、それよりも重要視しなきゃいけない
ことが他にあるということで。

他人のソースを読むときも、「処理がどこから始まっているか?」を気にする
よりも、「どんなオブジェクトやクラスがあって、それらがどう関係している
のか?」を気にするほうがよいと思いますがいかがでしょうか。
つまり、発想を手続き型からオブジェクト指向へと変えるわけです。
プログラムの中に関数がたくさんあれば、それは発想が手続き型のままで
ある証拠かもしれません。


どうしてもメイン処理をはじめに持ってきたければ、他のみなさんが示された
方法がよいと思います。


以上

--
	kuwata


In This Thread

Prev Next