루비에서 특정 변수가 해시인지 아니면 배열인지를 간단하고 우아한 방법은 무엇입니까?
무엇인지 확인하기 @some_var
위해
if @some_var.class.to_s == 'Hash'
나는 여부를 확인하는 더 우아한 방법이 확신 @some_var
A는 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 aTypeError
.
irb(main):005:0> {}.class
=> Hash
irb(main):006:0> [].class
=> Array
'IT story' 카테고리의 다른 글
이 ASP.NET MVC SelectList를 작동 시키려면 어떻게해야합니까? (0) | 2020.07.07 |
---|---|
WPF : 스크롤 막대가있는 ItemsControl (ScrollViewer) (0) | 2020.07.07 |
NSArray 요소를 NSString에 결합하는 방법은 무엇입니까? (0) | 2020.07.07 |
document.write를 포함 할 수있는 src로 스크립트 태그를 동적으로 추가 (0) | 2020.07.07 |
지원 라이브러리가있는 FloatingActionButton 예제 (0) | 2020.07.07 |