반응형
Ruby : 모듈에서 클래스 메소드를 정의 할 수 있습니까?
A
, B
&의 세 가지 클래스가 있다고 가정합니다 C
. 각 클래스가 , &에 self.foo
대해 정확히 동일한 코드를 가진 클래스 메서드를 갖기를 원합니다 .A
B
C
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
반응형
'IT Share you' 카테고리의 다른 글
값이 null 일 때 Thymeleaf 사용 (0) | 2020.12.09 |
---|---|
AJAX 및 jQuery를 사용하여 양식 제출 (0) | 2020.12.09 |
Ubuntu에 Mercurial을 설치하는 올바른 방법 (0) | 2020.12.09 |
GeoDjango GEOSException 오류 (0) | 2020.12.09 |
반응 탐색에서 뒤로 버튼 비활성화 (0) | 2020.12.09 |