prosource

클래스가 주어지면 인스턴스에 메서드(Ruby)가 있는지 확인합니다.

probook 2023. 7. 2. 20:49
반응형

클래스가 주어지면 인스턴스에 메서드(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습니.)ModuleClass하지만 그곳이 그곳이기 때문에.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

반응형