[#45298] グローバルにdefしたメソッドのスコープ — "takeru sasaki" <sasaki.takeru@...>
佐々木と申します。
10 messages
2008/08/06
[#45299] Re: グローバルにdefしたメソッドのスコープ
— rubikitch@...
2008/08/06
From: "takeru sasaki" <sasaki.takeru@gmail.com>
[#45318] Windows コマンドプロンプトで UTF-8を出力するには — Yuumi Yoshida <yuumi3@...>
おつかれさまです、 Yuumi3です。
11 messages
2008/08/08
[#45323] Re: Windows コマンドプロンプトで UTF-8を出力するには
— Yuumi Yoshida <yuumi3@...>
2008/08/08
こんばんは、Yuumi3です。
[#45324] tracer の出力が1.8,1.9では異なる。 — Kouya <kouyataifu4@...>
こんにちは、kouya です。
6 messages
2008/08/09
[#45334] def meth(*args, &block) の「*」「&」の呼び名は? — take_tk <ggb03124@...>
たけ(tk)です。
5 messages
2008/08/10
[#45356] nil.size — "ARAI Shunichi" <arai@...>
こんにちは、Rubyist九州の新井です。
9 messages
2008/08/19
[#45365] cygwinでRabyが動作しない。 — Kura syuu <kurasyuu@...>
初めまして 蔵修と申します。
11 messages
2008/08/22
[#45377] [ANN] REXMLのDoS脆弱性 — Shugo Maeda <shugo@...>
前田です。
5 messages
2008/08/23
[#45379] Design Patterns in Ruby — あひる <ahirusan@...>
あひる@Ducksysです。はじめまして。
5 messages
2008/08/23
[#45387] OpenSSL::CipherでのDESのやり方 — "Hideo Yamamoto" <deoohi@...>
はじめまして、山本と申します。
6 messages
2008/08/25
[#45393] JRubyについて&rubygemについて&RDTについて — Akira Hayakawa <ruby@...>
夜分遅くすいません。Akiraと申します。
10 messages
2008/08/25
[#45396] Re: JRubyについて&rubygemについて&RDTについて
— rubikitch@...
2008/08/25
From: Akira Hayakawa <ruby@i-mail.jp>
[#45397] Re: JRubyについて&rubygemについて&RDTについて
— Akira Hayakawa <ruby@...>
2008/08/25
ありがとうございます。
[#45398] Re: JRubyについて&rubygemについて&RDTについて
— rubikitch@...
2008/08/25
From: Akira Hayakawa <ruby@i-mail.jp>
[#45399] Re: JRubyについて&rubygemについて&RDTについて
— Akira Hayakawa <ruby@...>
2008/08/25
On Tue, 26 Aug 2008 08:27:24 +0900
[#45400] Re: JRubyについて&rubygemについて&RDTについて
— rubikitch@...
2008/08/26
From: Akira Hayakawa <ruby@i-mail.jp>
[#45406] Ruby1.9のインストールに失敗しました — Akira Hayakawa <ruby@...>
環境はUbuntu Linuxです。
7 messages
2008/08/27
[#45414] This is TestMail (テストメール) — "masataka kobayashi" <hotopoppo1@...>
I'm sorry . This is Test Mail
5 messages
2008/08/28
[#45427] Dir[] with **/ — Nobuhiro IMAI <nov@...>
いまいです。
8 messages
2008/08/29
[#45438] assert_equalの挙動について — Akira Hayakawa <ruby@...>
こんばんわ。Akiraです。
7 messages
2008/08/30
[#45447] sudo: gem: command not found — Akira Hayakawa <ruby@...>
EclipseのRDTはバグが多すぎて、DLTKはまだ開発途中
7 messages
2008/08/31
[#45448] Re: sudo: gem: command not found
— rubikitch@...
2008/08/31
From: Akira Hayakawa <ruby@i-mail.jp>
[#45449] やっぱりrubygemの仕組みがいまいち分かりません — Akira Hayakawa <ruby@...>
初期条件として、
8 messages
2008/08/31
[#45451] Re: やっぱりrubygemの仕組みがいまいち分かりません
— rubikitch@...
2008/08/31
From: Akira Hayakawa <ruby@i-mail.jp>
[#45454] Re: やっぱりrubygemの仕組みがいまいち分かりません
— Akira Hayakawa <ruby@...>
2008/08/31
On Sun, 31 Aug 2008 13:16:54 +0900
[ruby-list:45299] Re: グローバルにdefしたメソッドのスコープ
From:
rubikitch@...
Date:
2008-08-06 10:47:50 UTC
List:
ruby-list #45299
From: "takeru sasaki" <sasaki.takeru@gmail.com>
Subject: [ruby-list:45298] グローバルにdefしたメソッドのスコープ
Date: Wed, 6 Aug 2008 19:25:34 +0900
るびきちです。
とりあえず、xmpfilterによる注釈形式で途中の値を確かめましょう。
class Foo
def bar(a,b)
"Foo#bar(#{a},#{b})"
end
def baz
hello(3,4) # => "Foo#bar(3,4)"
Poo.hello(7,8) # => "Poo.bar(7,8)"
end
end
def bar(e,f)
"global bar(#{e},#{f})"
end
def hello(c,d)
# globalのbarではなくFoo#barが呼ばれる
# Object#helloは二度呼ばれているので「=> 1回目の値, 2回目の値」と注釈されている
self # => #<Foo:0x82da890>, main
bar(c,d) # => "Foo#bar(3,4)", "global bar(1,2)"
end
class Poo
def self.bar(i,j)
"Poo.bar(#{i},#{j})"
end
def self.hello(g,h)
# Poo.barが呼ばれる
bar(g,h) # => "Poo.bar(7,8)"
end
end
f2 = Foo.new
f2.baz # => "Poo.bar(7,8)"
hello(1,2) # => "global bar(1,2)"
method(:hello) # => #<Method: Object#hello>
method(:bar) # => #<Method: Object#bar>
> 下記プログラムを実行したときの「globalのbarではなくFoo#barが呼ばれる」部分はなぜそうなるのでしょうか。
> 直感的には「globalのbar」が呼ばれそうに思います。
グローバル関数は、実はObjectクラスのプライベートなインスタンスメソッドです。
つまり
class Object
private
def bar(e,f)
"global bar(#{e},#{f})"
end
def hello(c,d)
bar(c,d)
end
end
と同じです。
prviateになっているのは、関数的メソッド呼び出ししか許さないようにするためです。
だからどう見ても関数です。
しかし、Foo#baz内でhelloを呼ぶと、Foo#helloが定義されていないので、
グローバル関数のObject#helloを呼びます。注釈にあるように、Object#hello内での
selfはFooオブジェクトなのでObject#hello内でbarを呼び出すと、まずFoo#barを
探します。定義されていたので、Foo#barが呼び出されました。
ポイントは、グローバル関数はクラスに属するメソッドであることです。
--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/