• 締切済み

class << self ???

Ruby on Rails に興味をもち始めて見たのですが、そのすごさよりもどうやって動いてるんだろう?に興味が出てしまい、ソースコードを読み始めたら早速教本に載っていないなぞの構文を発見しました。(当方プログラミング初心者です^^;) module Rails  class << self   def boot! . . . タイトルにもある通り、class << selfの部分が謎です。 クラス名は宣言されていないし、しかも自分を継承している?? どうゆう意味なのでしょうか。。 ご存知の方是非とも教えて頂けると助かります。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

興味があって中身を調べてみるというのはとてもいいことだと思いますが、 Ruby初心者にいきなりRailsのソースはハードルが高すぎると思います(^^; とりあえず簡単に説明しておくと、 class << インスタンス いろいろ end という形式で、「特異メソッド」なるものが定義できます。 #特異メソッドという名前で参考書から探せるでしょう。 通常は x = Foo.new class << x ... end のように使うことが多いんですけど、Railsでは、 module Rails #class でないことに注意! class << self とすることで、このモジュールを取り込んだクラスに対して 先に出た「特異メソッド」を定義しています。 ここで登場している self はこの場合は module Rails を include や extend で取り込んだクラス(のメタクラスのインスタンス)になります。 まあとにかく Ruby 特有の黒魔術全開なので、手を出すのはもうちょっとあとにしたほうがよろしいかと。 満足せる豚。眠たげなポチ。:Ruby の include, extend まとめ http://blog.hacklife.net/archives/50749454.html

guttten
質問者

お礼

回答ありがとうございます。 確かにまだ難しいみたいなので、とりあえずはRailsを使えるようになってからそのうち再挑戦してみようと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Module#method_addedの挙動

    すいません、Rubyのドキュメントを見ながら動作を追っていて、疑問に感じたので質問をさせてください。 Module#method_addedというメソッドが追加されたタイミングで動作するメソッドがあります。 定義場所がModuleクラスの中なので、Moduleにメソッドを追加したら、それがmethod_addedを呼び出すと思って試して見たのですが、何故かそうなりません。 何故なのか理由がわからないんですが、教えていただけないでしょうか? ------------------------------------------------------------------ class Object def self.method_added(*_) p self.class.name p __method__ p _ end def self.singleton_method_added(*_) p self.class.name p __method__ p _ end end class Module def self.method_added(*_) p self.class.name p __method__ p _ end def self.slngleton_method_added(*_) p self.class.name p __method__ p _ end end module Foo def self.foo end def foo2 end end class Bar def self.bar end def bar2 end end ------------------------------------------------------------------ 出力結果 ------------------------------------------------------------------ "Class" :singleton_method_added [:bar] "Class" :method_added [:bar2] ------------------------------------------------------------------ 動作環境は、Mac rubyのバージョンは2.4.0です。 ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16]

    • ベストアンサー
    • Ruby
  • ruby on railsのmigrateでカラム名の変更ができません

    ruby on railsにて migrateでDBのカラム名を変更したいのですが、 エラーになってしまいます。 -エラーコード---------------------- rake aborted! uninitialized constant CreateArticles ----------------------------------- ★「datetime」カラム⇒「updated_at」カラムにしたい class RenameColumnArticles < ActiveRecord::Migration def self.up rename_column(:articles, :datetime, :updated_at) end def self.down rename_column(:articles, :updated_at, :datetime) end end よろしくお願いします。

  • Pythonのコードself多すぎ読み書きしにくい

    Pythonのクラスには通常class:宣言行直下で作成する「クラス変数」と、__init__()メソッド内で作成するかインスタンス作成後にインスタンス名.変数名で追加作成する「インスタンス変数」があります。 Pythonのクラス変数はJavaのクラスでstatic修飾子を付けて宣言したクラス変数と同じで、そのクラスから作成されたインスタンス全てに同じメモリーを割り当てます。 Pythonのインスタンス変数はインスタンスごとにメモリーが割り当てられるので、Javaの普通の変数(フィールド)のように同一クラス内のすべてのメソッドから参照できますが、参照するたびにいちいち「self.」を付けないといけません。 (例 かなり恣意的ですが。。。インデントはOKWAVEが取ってしまうかもしれせん) class Sample: def __init__(self): self.L = [] # Lは数値のリスト def setList(self, L): self.L = L def exe(self, i1, i2): # L[i1]>0かつL[i2]>0のとき、大きい方から小さい方を引いた # 値に、大きい方を小さい方で累乗した値を加える if self.L[i1] > 0 and self.L[i2]: if self.L[i1] > self.L[i2]: return (self.L[i1] - self.L[i2]) + self.L[i1] ** self.L[i2] else: return (self.L[i2] - self.L[i1]) + self.L[i2] ** self.L[i1] イテレーターを使て同じ処理をループする場合はいいのですが、ループで処理できない複雑な処理が続く場合はこのように「self」だらけになり、コーディングミスが多発し、コードが読みにくいものになります。 「self」を省略してインスタンス変数をメソッドから参照し、コードを読みやすいものにする手段はないのでしょうか? どうぞよろしくお願いします。

  • 呼ばれているメソッドがおかしくなります

    rubyのコードを書いていた時の疑問です。 以下のコードを見てみると、呼ばれているメソッドがおかしくなっているところがあるように見えます。 a = "hoge" module Mage def to_s :fuga end end a.extend(Mage) a.to_s # => :fuga a.singleton_class.ancestors # => [#<Class:#<String:0x007fdeea15c4a0>>, Mage, String, Comparable, Object, Kernel, BasicObject] 上のコードはObext#extendでto_sメソッドの挙動を上書きされていますが 継承をたどっていくと、Stringクラスのto_sメソッドではなくMageモジュールのto_sメソッドの方が、深いところに挿入されています。 継承関係と、実際に呼ばれるメソッドに齟齬があるように見えるのですが、これはどういう原因で起こるのでしょうか?

    • ベストアンサー
    • Ruby
  • ブロック1 Ruby認定試験対策問題

    Ruby認定試験対策問題をやっていたら分からないところがあったので、 教えてください。 2.9-1.ブロック ■問題 testメソッドに渡されたブロックのselfは次のうちどれか? class Foo def test (1..3).each{|i| yield(i)} end end foo = Foo.new foo.test{|i| i } ■回答 トップレベル ■解説 ブロックはメソッドの呼出し先のselfを継承します ■疑問 ・testメソッドに渡されたブロックとは、(1..3)のことを指すのでしょうか。 ・メソッドの呼出し先とは、foo.test{|i| i }のことを意味しているのでしょうか。 ・呼出し先のselfとは、fooかFooのことでしょうか? ・「selfはメソッド内で実行されるとそのメソッドを実行しているオブジェクトを参照することが出来ます」 と別のサイトに記載されていたのですが、「トップレベルのselfとはObjectクラスのメソッドを実行している」、という意味になるのでしょうか。 それがこの問題のどこに関連しているのでしょうか。

    • ベストアンサー
    • Ruby
  • Rubyの問題について質問です。

    Rubyの資格試験の勉強をしています。 分からない部分がありまして質問させていただきます。 class Employee attr_reader :id attr_accessor :name def initialize id , name @id = id @name = name end def to_s return "#{@id}:#{@name}" end def <=> other return self.id <=> other.id end employees = [ ] employees <<Employee.new("3","Tanaka") employees<<Employee.new("1","Suzuki") employees<<Employee.new("2","Sato") employee.sort! (質問) 「return self.id <=> other.id」この部分のselfとotherが何をさしているのか分かりません。3つめでインスタント化している「employees<<Employee.new("2","Sato")」のは、selfに入りそれまでに入れた値はotherに入っているのでしょうか? ご回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • プログラム言語を学びたいが実用的なのはどれでしょう

    Webサーバをたてて、CMSとしてWordpressなんかを使いたかったのですが、既存のDBからデータを取り出すのにどうやっていいかわからなかったので、作ってしまおうと思ったのがそもそものきっかけですがプログラミングそのものにも興味があります。 さしあたってやりたいのは、SQLクエリの結果をWebブラウザに表示させることで、このためにPHPではなくRubyもしくはPythonを選択する利点はありますでしょうか?実務で重宝するVBAはできるので、今度はPHPの勉強を考えていますが、 実はこのふたつの言語を選択する理由が分かりません。どちらも初心者向けの言語だと聞きます。ただ一般的にこれらで何をするのでしょうか?テキスト加工やファイル加工なら、自分にはVBAで十分です。 小規模Webアプリの構築をしたいのならPHP一択ですよね。最初はRubyおよびRailsも考えましたが一から学ぶならPHPの方が目的実現まで速いと感じたのでPHPを考えています。 なんちゃってWebプログラマにRuby/RailsもしくはPythonの利点を教えてください。

  • 別のクラスのインスタンスの作り方

    現在、javaからrubyに移行するために勉強しているのですが、別のファイルに定義したクラスのインスタンスが作成できなくて、困っています。 具体例をあげると require './B' class A end def initialize b = new B end end --別のファイル class B def initialize p 'hello' end  public : initalize end こんな2つのファイルがあったとして、Aのインスタンスを作成すると、 undefined method `B’ というエラーがでます。 私としてはこのエラーの原因がinitializeがデフォルトでprivate宣言なのが原因だと考えているのですが、publicと指定してもエラーとなることから、いくつか疑問が湧いたので質問させていただきます。 1、そもそもBクラスのインスタンスが作成できないのはinitializeがデフォルトでprivate宣言なのが原因なのか? 2、1があっていたと仮定するとBクラスのinitializeをpublic指定しているのになぜ呼び出せないのか? 3、rubyはなぜデフォルトでinitializeがprivateなのか?(javaではコンストラクタをprivateにするということは普通はしない。使うときはシングルトンやUtilのようなクラスを作るときに限る) 以上です。よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Rubyのsuperclassメソッドについて

    Rubyについての質問です。処理系は1.8.7です。 class Foo def initialize(a) @a = a end end のようなクラスを作成し、そのインスタンスを foo = Foo.new(1) のように作成します。 このとき、 foo.superclassを呼び出すと NoMethodError: undefined method `ancestors' for #<Foo:0x2b691220cc88 @a=1> とエラーになります。 一方で class FooExt < Foo def initialize (a,b) @b = b super a end end のようにFooを継承したクラスを作り、 fooext = FooExt.new(1,2) fooext.superclass とすると => Foo とsuperclassメソッドが動作します。 このsuperclassメソッドはどこで追加されたものなのでしょうか?

  • Ruby on rails sqlite3のドライバ?のインストールが

    Ruby on rails sqlite3のドライバ?のインストールがうまくいかない。 「rubyinstaller-1.8.6-p398.exe」をインストールして、gemのアップデート、「sqlite-3_6_23_1.zip」「sqlitedll-3_6_23_1.zip」をインストール?して、gemでsqlite3のドライバをインストールをすると以下のような文章がでてうまくいきません。(xp sp3) You've installed the binary version of sqlite3-ruby. It was built using SQLite3 version 3.6.23.1. It's recommended to use the exact same version to avoid potential issues. At the time of building this gem, the necessary DLL files where available in the following download: ttp://www.sqlite.org/sqlitedll-3_6_23_1.zip You can put the sqlite3.dll available in this package in your Ruby bin directory, for example C:\Ruby\bin ============================================================================= Successfully installed sqlite3-ruby-1.3.1-x86-mingw32 1 gem installed Installing ri documentation for sqlite3-ruby-1.3.1-x86-mingw32... Enclosing class/module 'mSqlite3' for class Statement not known No definition for libversion Installing RDoc documentation for sqlite3-ruby-1.3.1-x86-mingw32... Enclosing class/module 'mSqlite3' for class Statement not known No definition for libversion ドライバのバージョンを下げたりしてみてもうまくいきません。 rubyは勉強している書籍にあわせて1.8.6を使っています。 何が問題なのでしょうか?

    • ベストアンサー
    • Ruby