클래스가 주어지면 인스턴스에 메서드(Ruby)가 있는지 확인합니다.
나는 루비에서 내가 사용할 수 있는 것을 알고 있습니다.respond_to?
개체에 특정 메서드가 있는지 확인합니다.
그런데 클래스를 감안할 때 인스턴스에 특정 방법이 있는지 어떻게 확인할 수 있습니까?
i.e, 비슷한 것
Foo.new.respond_to?(:bar)
하지만 새로운 사례를 예시하는 것보다 더 좋은 방법이 있을 것 같습니다.
왜 모든 사람들이 당신이 사용해야 한다고 제안하는지 모르겠어요.instance_methods
그리고.include?
때에method_defined?
그 일을 합니다.
class Test
def hello; end
end
Test.method_defined? :hello #=> true
메모
이 다른 에서 루비로 이 만약언당OO루OO오OO당OO생OO경OO는OO하OO이OO우OO각OO신OO나OO거OO로OO비OO서OO에OO어OO이OO신OO다OO른OO▁thatOO언OO▁orOO▁languageOO는OO경OO우OO▁fromOO하OO▁thinkOO▁rubyOO▁inOO▁anotherOO▁ooOO각OO▁toOO생OO이OO▁caseOO▁youOO▁areOO당method_defined
다음을 사용하여 명시적으로 정의한 메서드만 의미합니다.
def my_method
end
그러면 다음을 읽으십시오.
Ruby에서 모델의 속성(속성)도 기본적으로 방법입니다.그렇게method_defined?
메서드뿐만 아니라 속성에 대해서도 true를 반환합니다.
예:
속성 String을 되었습니다.first_name
:
<instance>.first_name.class #=> String
<instance>.class.method_defined?(:first_name) #=> true
이래first_name
속성과 메서드(및 String 유형의 문자열)입니다.
사용할 수 있습니다.method_defined?
다음과 같이:
String.method_defined? :upcase # => true
, 휴이뛰며나, 어입니다적효율성다대▁▁much다▁,,니,효보다 훨씬 쉽고, 휴대하기 쉽고, 효율적입니다.instance_methods.include?
다른 모든 사람들이 제안하는 것 같습니다.
가 일부 으로 응답하는지 알 수하십시오.method_missing
예를 들어 재정의함으로써respond_to?
또는 Ruby 1.9.2 이후에 를 정의합니다.
실제로 개체와 클래스 모두에 대해 작동하지 않습니다.
이 작업은 다음과 같습니다.
class TestClass
def methodName
end
end
따라서 주어진 답변으로 다음과 같은 효과를 얻을 수 있습니다.
TestClass.method_defined? :methodName # => TRUE
하지만 이것은 효과가 없습니다.
t = TestClass.new
t.method_defined? : methodName # => ERROR!
클래스와 개체 모두에 사용합니다.
클래스:
TestClass.methods.include? 'methodName' # => TRUE
개체:
t = TestClass.new
t.methods.include? 'methodName' # => TRUE
"클래스를 지정하고 인스턴스에 메서드(루비)가 있는지 확인하십시오."에 대한 대답이 더 좋습니다.루비가 이런 기능을 내장하고 있는 것 같은데, 왠지 놓쳤어요.어쨌든 제 대답은 참고용으로 남겨져 있습니다.
Ruby 클래스는 메서드에 응답하고 .Ruby 1.8에서 첫 번째는 문자열 배열에 있는 모든 인스턴스 메서드 이름을 나열하고 두 번째는 공용 메서드로 제한합니다.두 번째 행동은 당신이 원하는 것일 가능성이 높습니다.respond_to?
또한 기본적으로 공용 메서드로 제한됩니다.
Foo.public_instance_methods.include?('bar')
그러나 Ruby 1.9에서는 이러한 메서드가 일련의 기호를 반환합니다.
Foo.public_instance_methods.include?(:bar)
이 작업을 자주 수행할 계획이라면 확장하는 것이 좋습니다.Module
방법을 입니다. ( 을이당것는게일하은습상하기▁(이▁to▁seem수▁a다▁method▁odd▁to▁shortcut있▁to▁this▁assign▁(▁include습니.)Module
에 Class
하지만 그곳이 그곳이기 때문에.instance_methods
live,그 live, 그과일치것이가좋장습다니는하턴패methods),▁methods다좋니습가장▁live것,▁live)이치methods
class Module
def instance_respond_to?(method_name)
public_instance_methods.include?(method_name)
end
end
만약 당신이 Ruby 1.8과 Ruby 1.9를 모두 지원하고 싶다면, 그것은 문자열과 기호를 모두 검색하는 논리를 추가하는 편리한 장소가 될 것입니다.
해라Foo.instance_methods.include? :bar
이것이 최선의 방법인지는 잘 모르겠지만 항상 다음과 같이 할 수 있습니다.
Foo.instance_methods.include? 'bar'
뭔가 잘못된 것 같습니다.method_defined?
레일즈에서.일관성이 없거나 뭔가 있을 수 있으므로 레일즈를 사용하는 경우에는 의 것을 사용하는 것이 좋습니다.
"method_defined에 대한 정의? 인스턴스화할 때까지 ActiveRecord 클래스에서 작동하지 않습니다."는 불일치에 대한 질문입니다.
개체가 일련의 메서드에 응답할 수 있는지 확인하는 경우 다음과 같은 작업을 수행할 수 있습니다.
methods = [:valid?, :chase, :test]
def has_methods?(something, methods)
methods & something.methods == methods
end
그methods & something.methods
공통/오프라인 요소에서 두 배열을 결합합니다. something.method에는 확인하는 모든 메서드가 포함됩니다. 동일한 메서드가 포함됩니다.예:
[1,2] & [1,2,3,4,5]
==> [1,2]
그렇게
[1,2] & [1,2,3,4,5] == [1,2]
==> true
이 경우 기호를 사용할 수 있습니다. 왜냐하면 .methods를 호출하면 기호 배열이 반환되고 사용한 경우["my", "methods"]
거짓으로 반환됩니다.
class Foo
def self.fclass_method
end
def finstance_method
end
end
foo_obj = Foo.new
foo_obj.class.methods(false)
=> [:fclass_method]
foo_obj.class.instance_methods(false)
=> [:fclass_method]
이것이 도움이 되길 바랍니다!
klass.instance_methods.include :method_name
또는"method_name"
루비 버전에 따라 다릅니다.
하는 동안에respond_to?
공용 메서드에 대해서만 true를 반환합니다. 클래스에서 "잘못된 정의"를 확인하면 개인 메서드와도 관련될 수 있습니다.
Ruby v2.0+에서는 공용 및 개인 세트를 모두 검사할 수 있습니다.
Foo.private_instance_methods.include?(:bar) || Foo.instance_methods.include?(:bar)
저의 경우 루비 2.5.3으로 작업하는 다음 문장이 완벽하게 작동했습니다.
value = "hello world"
value.methods.include? :upcase
true 또는 false 부울 값을 반환합니다.
언급URL : https://stackoverflow.com/questions/3303347/given-a-class-see-if-instance-has-method-ruby
'prosource' 카테고리의 다른 글
커밋하기 전에 Git에서 후행 공백을 자동으로 제거하도록 합니다. (0) | 2023.07.02 |
---|---|
오라클 11g 시스템에서 사용 가능한 디렉터리 개체를 찾는 방법은 무엇입니까? (0) | 2023.07.02 |
MiniTest에서 단일 테스트를 실행할 수 있습니까? (0) | 2023.07.02 |
수정할 열이 ID 열이 아닙니다. (0) | 2023.06.27 |
워드프레스 스테이징 환경 (0) | 2023.06.27 |