[過去ログ] Ruby 初心者スレッド Part 58 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
401(7): デフォルトの名無しさん [sage] 2016/06/22(水) 06:25:24.35 ID:jdKVcriH(1/5) AAS
module A
def a
p 'A'
end
end
module B
def b; a; end
def a
p 'B'
end
end
class X
include B
include A
end
p X.ancestors #=> [X, A, B, Object...]
p X.new.b
"A"
"A"
なぜ、2回もAが表示されたの? Bが表示されない
モジュールB内で、aを呼んだときは、静的スコープのB.a を読んでくれないな。
常に動的に、X, A, B の順に、aを探すのか
「メタプログラミング Ruby」1.6章より
402(2): 401 [sage] 2016/06/22(水) 06:34:16.68 ID:jdKVcriH(2/5) AAS
B.a を呼んだときは、メソッド探索順に影響されず、
静的スコープのB.a を呼ぶ方法はないの?
動的言語だから、無理なのか?
403: デフォルトの名無しさん [sage] 2016/06/22(水) 08:04:36.14 ID:AQa0dSs+(1/2) AAS
>>401
ひっかけ問題かな。p の数を数えてみろ。
409: 401 [] 2016/06/22(水) 20:22:56.84 ID:jdKVcriH(3/5) AAS
>>401
自己レス
>p X.new.b
ここにも、p を付けていたから、2回表示された
>>407407(2): デフォルトの名無しさん [sage] 2016/06/22(水) 17:17:51.11 ID:7oRMeHhG(1) AAS
foo bar, baz do 0 end
foo bar, baz { 0 }
これって動作違うのな、テスト書いてたらエラー出てびっくりしたわ
意味わからん。カッコで囲んで
410(2): デフォルトの名無しさん [] 2016/06/22(水) 20:31:09.09 ID:1DvIaRNW(1/3) AAS
>>401
>モジュールB内で、aを呼んだときは、静的スコープのB.a を読んでくれないな。
>常に動的に、X, A, B の順に、aを探すのか
p X.ancestors #=> [X, A, B, Object...]
この結果を見れば明らかで、B, A の順序で include したのだから
Rubyの仕様に従った振る舞いな訳だけど、何が問題なの?
リファレンスを熟読してRubyの仕様を理解したほうがいいと思うよ
基礎ができていないのにメタプログラミングに手を出すのが挫折の原因だ
>>402
> 静的スコープのB.a を呼ぶ方法はないの?
ないよ
やるならクラス X の定義において、 include の順序を逆にする
> 動的言語だから、無理なのか?
いや、動的言語のRubyでも(モジュールやクラスを含む)定数の宣言は静的だよ
【ここで静的とは、一度宣言した値を後から(破壊的に)更新できないことを意味する】
できない理由は、上で書いたように「Ruby の仕様」だから
そのRubyの仕様に不満があるなら、多重継承とその問題点、および Mix-in が考案された
背景を勉強してから、Rubyコアへ次期Rubyの仕様変更案として提案すればいい
417(2): 401 [sage] 2016/06/22(水) 22:45:04.32 ID:jdKVcriH(4/5) AAS
module B
def b; a; end
def a
p 'B'
end
end
静的言語では、bを呼んだら、同じモジュール内の、aを呼ぶのが自然。
モジュールBのbを呼んで、次にaを呼ぶ際、異なるモジュールのaを呼ぶとは普通、思わないだろw
モジュールBを書いている奴は、当然同じモジュール内の、b・aを想定している
これぐらい静的スコープから、解決してほしい
432: 401 [] 2016/06/25(土) 16:08:58.21 ID:4ZuZDTqb(1) AAS
>>401
module A
class AA
def a; p 'A'; end
end; end
module B
class BB
def b; a; end
def a; p 'B'; end
end; end
class X
include B; include A
BB.new.b
end
p X.ancestors #=> [X, A, B, Object...]
X.new #=> "B"
a()をクラス内に入れたら、メソッド探索順では、Aモジュールの方が先なのに、
A::AA.a ではなく、B::BB.a が呼ばれるようになった
b()・a()が同じクラス内なら、呼び出し順は、モジュール探索順よりも、クラス内が優先される
436(1): uy ◆e6.oHu1j.o [] 2016/06/30(木) 08:28:51.01 ID:U+B64GZ8(1/2) AAS
>>401
外部リンク:ideone.com
rubyのこの辺のスコープは不満ある
直される事はないだろうけど
rubyでしかやらないようなコードに分かりやすいルール作るのが難しいから
結局避けて書いていく
積極的には使われない癖に無駄に複雑な仕様だけが
class、module、include、extend 周りに拡がる
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.117s