programing

변수가 해시인지 배열인지 알 수 있는 루비의 우아한 방법은 무엇입니까?

topblog 2023. 7. 7. 18:27
반응형

변수가 해시인지 배열인지 알 수 있는 루비의 우아한 방법은 무엇입니까?

무엇을 확인하기 위해@some_var나는 하는 중입니다.

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

저는 더 우아한 방법으로 확인할 수 있다고요@some_var이다.Hash또는Array.

다음을 수행할 수 있습니다.

@some_var.class == Hash

또는 다음과 같은 것도 있습니다.

@some_var.is_a?(Hash)

"is_a?" 방법은 클래스가 개체 조상 트리의 어느 곳에나 있는 경우에 참이라는 것에 주목할 필요가 있습니다.예를 들어:

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

위는 @some_var가 객체에서 파생된 해시 또는 다른 클래스의 인스턴스인 경우에 참입니다.클래스 유형에 대해 엄격한 일치를 원한다면 == 또는 instance_of를 사용하시겠습니까?방법이 아마도 당신이 찾고 있는 것일 것입니다.

무엇보다도, 문자 그대로의 질문에 대한 가장 좋은 대답은

Hash === @some_var

하지만 그 질문은 여기서 오리 타이핑을 하는 방법을 보여줌으로써 정말로 대답되었어야 했습니다.그것은 당신이 어떤 종류의 오리를 필요로 하는지에 따라 약간 다릅니다.

@some_var.respond_to?(:each_pair)

또는

@some_var.respond_to?(:has_key?)

아니 심지어는

@some_var.respond_to?(:to_hash)

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

일반적으로 루비색으로 "유형"을 찾을 때 실제로 "오리형" 또는 "오리처럼 돌팔이가"를 원하는 것입니다.특정 방법에 대응하는지 확인할 수 있습니다.

@some_var.respond_to?(:each)

다음에 응답하므로 @some_var를 반복할 수 있습니다.

해시 또는 어레이 유형을 알고 싶다면 다음을 수행할 수 있습니다.

["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 @some_var
when Hash
   ...
when Array
   ...
end

사용할 수 있습니다.instance_of?

@some_var.instance_of?(Hash)

사용자:

@var.respond_to?(:keys)

Hash 및 ActiveSupport에서 작동합니다.다른 액세스 권한을 가진 해시입니다.

실제로 변수가 단순한 tell이 아니라 Array인지 해시인지에 따라 다르게 동작하는 경우가 많습니다. 경우 우아한 관용구는 다음과 같습니다.

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

호출하지 않습니다..class에 대한 방법.item.

개체가 엄격한지 또는 확장되었는지 테스트하려는 경우Hash사용:

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

그러나 Ruby의 오리 타이핑을 활용하기 위해 다음과 같은 작업을 수행할 수 있습니다.

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

이 기능은 다음을 사용하여 일부 값에만 액세스하려는 경우에 유용합니다.value[:key]통사론

참고로Array.new["key"]a를 올릴 것입니다.TypeError.

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

언급URL : https://stackoverflow.com/questions/5367114/what-is-an-elegant-way-in-ruby-to-tell-if-a-variable-is-a-hash-or-an-array

반응형