IT Share you

Ruby : 모듈에서 클래스 메소드를 정의 할 수 있습니까?

shareyou 2020. 12. 9. 21:58
반응형

Ruby : 모듈에서 클래스 메소드를 정의 할 수 있습니까?


A, B&의 세 가지 클래스가 있다고 가정합니다 C. 각 클래스가 , &에 self.foo대해 정확히 동일한 코드를 가진 클래스 메서드를 갖기를 원합니다 .ABC

self.foo모듈에서 정의 하고이 모듈을 A, B&에 포함 할 수 C있습니까? 그렇게하려고했지만 foo인식되지 않는다는 오류 메시지가 나타납니다 .


module Common
  def foo
    puts 'foo'
  end
end

class A
  extend Common
end

class B
  extend Common
end

class C
  extend Common
end

A.foo

또는 나중에 클래스를 확장 할 수 있습니다.

class A
end

class B
end

class C
end

[A, B, C].each do |klass|
  klass.extend Common
end

module Foo
  def self.included(base)
    base.extend(ClassMethods)
  end
  module ClassMethods
    def some_method
      # stuff
    end
  end
end

추가해야 할 한 가지 가능한 참고 사항-모듈이 모든 클래스 메서드가 될 경우- extend ModuleName모듈 내부에 ClassMethods 모듈을 사용하는 것보다 Model에서 사용 하고 대신 모듈에서 직접 메서드를 정의하는 것이 좋습니다.

 module ModuleName
   def foo
     # stuff
   end
 end

Rails 3는 모듈 ActiveSupport::Concern구문을 단순화하는 것을 목표로 명명 모듈을 도입했습니다 .

module Foo
  extend ActiveSupport::Concern

  module ClassMethods
    def some_method
      # stuff
    end
  end
end

이를 통해 모듈에 몇 줄의 "상용구"코드를 저장할 수있었습니다.


이것은 루비를 특별하게 만드는 기본적인 루비 믹스 인 기능입니다. extend모듈 메서드를 클래스 메서드로 변환 하는 동안 모듈 메서드를 include포함 / 확장 클래스 또는 모듈의 인스턴스 메서드로 변환합니다.

module SomeClassMethods
  def a_class_method
    'I´m a class method'
  end
end

module SomeInstanceMethods
  def an_instance_method
   'I´m an instance method!'
  end
end

class SomeClass
  include SomeInstanceMethods
  extend SomeClassMethods
end

instance = SomeClass.new
instance.an_instance_method => 'I´m an instance method!'

SomeClass.a_class_method => 'I´m a class method'

Oliver의 대답 Define Class 메서드와 인스턴스 메서드를 모듈로 함께 확장하고 싶었습니다.

module Foo
 def self.included(base)
   base.extend(ClassMethods)
 end
 module ClassMethods
   def a_class_method
     puts "ClassMethod Inside Module"
   end
 end

 def not_a_class_method
   puts "Instance method of foo module"
 end
end

class FooBar
 include Foo
end

FooBar.a_class_method

FooBar.methods.include?(:a_class_method)

FooBar.methods.include?(:not_a_class_method)

fb = FooBar.new

fb.not_a_class_method

fb.methods.include?(:not_a_class_method)

fb.methods.include?(:a_class_method)

참고 URL : https://stackoverflow.com/questions/4699355/ruby-is-it-possible-to-define-a-class-method-in-a-module

반응형