2016-07-23 4 views
2

私はRuby on Railsを例で学習しています。Ruby:あるクラスのサブクラスの[number]の文法名

class RemoveOrderListNumberAndStateFromOrderLists < ActiveRecord::Migration[5.0] 
    def up 
    remove_column :order_lists, :order_list_number 
    remove_column :order_lists, :state 
    end 

    def down 
    add_column :order_lists, :order_list_number, :string 
    add_column :order_lists, :state, :integer 
    end 
end 

私にはわからない事は、このラインである:このコマンドは意味

class RemoveOrderListNumberAndStateFromOrderLists < ActiveRecord::Migration[5.0] 

私が知っている:クラスを作成し、それがある私は、ここでは一つのサンプルコードで、移行フォルダに表示しますActiveRecord::Migrationのサブクラスで、5.0はプロジェクトのレール版です。私が知らないことは:上記の場合に、クラスの後に[number]を宣言できるルビー文法の名前です。私は唯一の方法は配列だと思いますが、この場合はそうではないでしょう。あなたがsource codeをチェックする場合は、これはあなたのケースでは、ActiveRecord::Migrationの互換バージョンを見つけるために使用され、これがそうあなたの移行がのサブクラスになるクラスActiveRecord::Migration::Currentを返されたであろうことを

おかげ

+0

でそのクラスのメソッドを使用して見ることができます。 – MarsAtomic

答えて

4

Rubyの言葉には「構文的砂糖」というものがたくさん付いています。異なるアイデアを表現することができます。砂糖の目的は、プログラマがそのアイデアを、その人に最も合った方法で表現する方法を見つけることができるようにすることです。

あなたの場合、角括弧は、引数を指定してメソッドを呼び出す別の方法です。機能的な違いはありません。 proc[]proc.call()と言う別の方法ですので、角括弧は単にcallを隠しています。通常、これらの括弧はlambdaと組み合わせてのみ表示されます。このタイプの表記法に対応する具体的な「文法名」はありません。それは単なる表記です。

具体的には、ActiveRecord::Migrationで呼び出されているクラスメソッドで、どのマイグレーションバージョンが使用されているかをクラスに通知します。注意:リリース版のRailsをお持ちの場合は、その記法は必要ありません。ベータ版が終了した後で削除されているはずです。

あなたはどこで、どのようActiveRecord::Migrationあなたは答えの一つに満足している場合は、左にチェックマークをクリックして1を受け入れてくださいGitHub repository

def self.[](version) 
     version = version.to_s 
     name = "V#{version.tr('.', '_')}" 
     unless Compatibility.const_defined?(name) 
     versions = Compatibility.constants.grep(/\AV[0-9_]+\z/).map { |s| s.to_s.delete('V').tr('_', '.').inspect } 
     raise "Unknown migration version #{version.inspect}; expected one of #{versions.sort.join(', ')}" 
     end 
     Compatibility.const_get(name) 
    end 
1

を参照してくださいねそのクラス。

現在のところ、v4.2とv5.0の2つのバージョンしか利用できないと思います。

関連する問題