IT story

루비에서 특정 변수가 해시인지 아니면 배열인지를 간단하고 우아한 방법은 무엇입니까?

hot-time 2020. 7. 7. 07:32
반응형

루비에서 특정 변수가 해시인지 아니면 배열인지를 간단하고 우아한 방법은 무엇입니까?


무엇인지 확인하기 @some_var위해

if @some_var.class.to_s == 'Hash' 

나는 여부를 확인하는 더 우아한 방법이 확신 @some_varA는 Hash나가 Array.


당신은 할 수 있습니다 :

@some_var.class == Hash

또는 다음과 같은 것 :

@some_var.is_a?(Hash)

"is_a?"라는 점은 주목할 가치가 있습니다. 클래스가 객체 조상 트리의 아무 곳에 나 있으면 메소드는 true입니다. 예를 들어 :

@some_var.is_a?(Object)  # => true

@some_var가 Object에서 파생 된 해시 또는 다른 클래스의 인스턴스 인 경우 위의 내용이 적용됩니다. 따라서 == 또는 instance_of?를 사용하여 클래스 유형을 엄격히 일치 시키려면? 방법은 아마도 당신이 찾고있는 것입니다.


우선, 문자 질문에 대한 가장 좋은 대답은

Hash === @some_var

그러나 여기서 오리 타이핑을 수행하는 방법을 보여줌으로써 질문에 실제로 대답해야했습니다. 그것은 어떤 종류의 오리가 필요한지에 달려 있습니다.

@some_var.respond_to?(:each_pair)

또는

@some_var.respond_to?(:has_key?)

또는

@some_var.respond_to?(:to_hash)

응용 프로그램에 따라 맞을 수 있습니다.


루비에서는 보통 "type"을 찾을 때 실제로 "duck-type"또는 "ducks as duck?"을 원합니다. 특정 방법에 응답하는지 확인할 수 있습니다.

@some_var.respond_to?(:each)

@some_var는 다음에 응답하기 때문에 반복 할 수 있습니다.

실제로 유형을 알고 싶다면 Hash 또는 Array 인 경우 다음을 수행 할 수 있습니다.

["Hash", "Array"].include?(@some_var.class)  #=> check both through instance class
@some_var.kind_of?(Hash)    #=> to check each at once
@some_var.is_a?(Array)   #=> same as kind_of

Hash === @some_var #=> return Boolean

이것은 case 문과 함께 사용할 수도 있습니다

case @some_var
when Hash
   ...
when Array
   ...
end

나는 이것을 사용한다 :

@var.respond_to?(:keys)

해시 및 ActiveSupport :: HashWithIndifferentAccess에서 작동합니다.


실제로는 단순한 변수가 아니라 변수가 배열인지 해시인지에 따라 다르게 행동하기를 원할 것입니다. 이 상황에서 우아한 관용구는 다음과 같습니다.

case item
  when Array
   #do something
  when Hash
   #do something else
end

.class메소드를 호출하지 않습니다 item.


당신이 사용할 수있는 instance_of?

예 :

@some_var.instance_of?(Hash)

If you want to test if an object is strictly or extends a Hash, use:

value = {}
value.is_a?(Hash) || value.is_a?(Array) #=> true

But to make value of Ruby's duck typing, you could do something like:

value = {}
value.respond_to?(:[]) #=> true

It is useful when you only want to access some value using the value[:key] syntax.

Please note that Array.new["key"] will raise a TypeError.


irb(main):005:0> {}.class
=> Hash
irb(main):006:0> [].class
=> Array

참고URL : https://stackoverflow.com/questions/5367114/what-is-a-simple-elegant-way-in-ruby-to-tell-if-a-particular-variable-is-a-has

반응형