注意を#<attachment>_data_uri
アクセサを追加します。この答えを準備し、数時間を要しました。その間、ジャンコムはうまく答えています。
RailsやShrineの人は、Rubyでできることの知識を、Rubyの本を読んで想像できるレベルをはるかに超えています。私は十数語を読んでいます。時間の
99%が含ま
include SomeModule
とSomeModule
はrequire 'some_module'
と現在のソースファイルに組み込まれる別個のファイルsome_module.rb
で定義されている形態です。
この
include ImageUploader::Attachment.new(:image)
は多くの理由のために注意が必要です。時間の
===内部クラス===
98%、クラスは主DEFメソッドが含まれて外部オブジェクト、一部が含まれており、クラスのインスタンス変数のピンチです。 Rubyのコードは数多く書かれていませんが、特別な状況では内部クラスには一度だけ書かれています。外部からは、またはShrine::Plugins::Base::AttacherMethods
など、完全な アクセスパスを指定することによってのみ使用できます。
私は1つが
ImageUploader::Attachment
===モジュールを書くことができるように、サブクラスが内部クラスを「継承」することを知りませんでした。new ===
十分なRubyドキュメントを読むと、クラスとモジュールの違いがモジュールをインスタンス化できないということが1,000倍わかります。モジュールは、クラス内のコードまたは(主に)mixinメソッドの周囲に名前空間を作成するためにのみ使用されます(より正確には、SomeModuleはメソッドの検索パスがクラスからSomeModuleに、次にスーパークラスになるように匿名スーパークラスを作成します明示的に定義されていない))。
こうして私は、拷問の下で、モジュールのための新しい方法がないと宣誓したでしょう。なぜなら、必要性がないからです。しかし、匿名モジュールを返すものがあります。
まあ、ここではモジュールではなくクラスImageUploader::Attachment
をインスタンス化し、さらにModule.new
はクラスModule
をインスタンス化します。
===発現モジュールを返す必要があり、一定ではなく式を使用しない含む1%のための発現===
を含みます。そして、AttachmentがModuleから継承する理由についてのあなたの答えがあります。そのような相続財産は、不平をつきます。次のコードを実行すると動作します。
t.rb:28:in `include': wrong argument type Shrine::Attachment_O (expected Module) (TypeError)
from t.rb:28:in `<class:Picture>'
from t.rb:27:in `<main>'
ファイルt.rb:
class Shrine
class Attachment_O
def initialize(parm=nil)
puts "creating an instance of #{self.class.name}"
end
end
class Attachment_M < Module
def initialize(parm=nil)
puts "creating an instance of #{self.class.name}"
end
end
end
print 'Attachment_O ancestors '; p Shrine::Attachment_O.ancestors
print 'Attachment_M ancestors '; p Shrine::Attachment_M.ancestors
class ImageUploader < Shrine
end
imupO = ImageUploader::Attachment_O.new
imupM = ImageUploader::Attachment_M.new
print 'imupO is a Module ? '; p imupO.is_a?(Module)
print 'imupM is a Module ? '; p imupM.is_a?(Module)
class Picture
# include ImageUploader::Attachment_O.new(:image)
include ImageUploader::Attachment_M.new(:image)
end
実行:
$ ruby -w t.rb
Attachment_O ancestors [Shrine::Attachment_O, Object, Kernel, BasicObject]
Attachment_M ancestors [Shrine::Attachment_M, Module, Object, Kernel, BasicObject]
creating an instance of Shrine::Attachment_O
creating an instance of Shrine::Attachment_M
imupO is a Module ? false
imupM is a Module ? true
creating an instance of Shrine::Attachment_M
あなたはクラスの画像で
# include ImageUploader::Attachment_O.new(:image)
のコメントを解除した場合でも、誤りがあります
これはそれがすべてである:それは空であるため、一見すると
は、添付ファイルの定義は、好奇心と思われます。私は詳細にshrine.rbを勉強していないが、私はこれを見てきました:
# Load a new plugin into the current class ...
def plugin(plugin, *args, &block)
...
self::Attachment.include(plugin::AttachmentMethods) if defined?(plugin::AttachmentMethods)
明らかにアタッチメントを後でモジュールを含めることによって方法が移入され、より正確に、include
は添付ファイルへの匿名のスーパークラスを作成し、このメソッドはAttachmentMethodsを指しており、メソッド検索メカニズムは含まれているモジュールのメソッドを見つけます。 How does Inheritance work in Ruby? も参照してください。
宝石をありがとう、私はあなたが使用するコーディングスタイルが本当に好きです。 ImageUploader :: Attachment.new(:image)をインスタンス化するときに、 'AttachmentMethods'の中の' initialize'メソッドがどのように呼び出されるのか、私が不安なのは唯一のことです。 – trueinViso
ファイルの末尾に 'Shrine :: plugins Shrine :: Plugins :: Base'が呼び出されます。これは' Shrine :: Plugins :: Base :: AttachmentMethods'を 'Shrine :: Attachment'に含めます(' Shrine :: Plugins :: Base :: ClassMethods#plugin')ので、 'Shrine :: Plugins :: Base :: AttachmentMethods#initialize'とそのモジュールの他のメソッドはすべて' Shrine :: Attachment'に追加されます'Shrine :: Attachment#initialize'が定義されています。 –
私はJeremy Evansにプラグインシステムの実装全体を借りていますが、それは実質的にRodaの宝石のコピー貼りです:https://github.com/jeremyevans/roda –