Ruby의 Hash 해시 유형 기본 작동 방법 소결

6492 단어 RubyHash
1. 해시 만들기: 그룹을 만드는 것처럼 해시 클래스를 통해 해시 실례를 만들 수 있습니다.

h1 = Hash.new             # nil
h2 = Hash.new(“This is my first hash instance”) # ” This is my first hash instance”:
위의 두 가지 예는 모두 빈 Hash 실례를 만들었다.Hash 대상에는 항상 기본값이 있습니다. Hash 대상에서 지정한 인덱스 (key) 를 찾지 못하면 기본값이 되돌아오기 때문입니다.
Hash 대상을 만들면 그룹처럼 항목을 추가하거나 삭제할 수 있습니다.유일하게 다른 것은 그룹에 있는 인덱스는 정수일 뿐이고, Hash에 있는 인덱스(key)는 모든 종류(any type of object)와 유일한 데이터일 수 있다는 것이다.

h2["one"] = " "
h2["two"] = " "
h2["three"] = " "
h2["four"] = " "
Note: Hash에 값을 부여할 때 같은 키를 사용하면 뒤에 있는 값이 앞의 값을 덮어씁니다.또한 루비는 Hash를 쉽게 만들고 초기화하는 방법을 제공합니다. 키 뒤에 => 기호를 추가하고 값을 따라가면 됩니다.각 키-value 쌍은 쉼표로 구분됩니다.그리고 전체적으로 괄호로 묶는다.

h2 = {
"one" => " ",
"two" =>" ",
"three" =>" ",
"four" =>" " 
}
 
2. 색인을 통해 Hash 값을 저장합니다.
값을 얻으려면 다음 방법을 사용하십시오.

  puts h2[“one”]    #=>” ”
지정한 키가 존재하지 않으면 기본값을 되돌려줍니다.이 밖에 default 방법으로 기본값을 얻을 수 있습니다.default + = 방법으로 기본값을 설정할 수 있습니다

    puts h1.default
    h1.default += “This is set value method”
 
3. Hash 복사:
수조와 마찬가지로 우리는 하나의hash 변수를 다른hash 변수에 분배할 수 있다. 그들은 모두 같은 Hash를 인용하기 때문에 그 중의 하나가 변하면 다른 값도 따라서 변한다.

  h3 = h2
  h3[“one”] = “ ”
  puts h h2[“one”]    #=>” ”
때때로 우리는 위의 상황이 발생하는 것을 원하지 않는다. 즉, 그 중의 하나를 수정한 값도 다른 하나를 따라 수정했다. 우리는clone 방법으로make a new copy를 사용할 수 있다.

  h4 = h2.clone
  h4[“one”] = “ ”
  puts h2[“one”]       #=>” ”(i.e.  )
 
4. Hash 정렬:
우리가 Hash를 정렬해야 할 때, 수조처럼 간단하게sort 방법을 사용할 수 없습니다. 수조의 데이터 형식이 모두 같기 때문에(정형), Hash의 데이터 형식은 완전히 같지 않을 수 있습니다. 예를 들어 정수 형식과 문자열 형식은 함께 정렬할 수 없습니다. 이때 우리가 처리해야 합니다. 아래와 같습니다. (하쉬의 데이터 형식이 모두 같으면 다음과 같이 처리하지 않아도 됩니다.)

  def sorted_hash(aHash)
    return aHash.sort{
      |a,b| a.to_s <=> b.to_s      
    }
  End
h1 = {1=>'one', 2=>'two', 3=> 'three'}
h2 = {6=>'six', 5=>'five', 4=> 'four'}
h3 = {'one'=>'A', 'two'=>'B','three'=>'C'}
h4 = h1.merge(h2)      # hash
h5 = h1.merge(h3)
def sorted_hash(aHash)
 return aHash.sort{|a,b| a.to_s <=> b.to_s }
end
p(h4)     
p(h4.sort)
p(h5)
p(sorted_hash(h5))
결과

{5=>"five", 6=>"six", 1=>"one", 2=>"two", 3=>"three", 4=>"four"}
[[1, "one"], [2, "two"], [3, "three"], [4, "four"], [5, "five"], [6, "six"]]
{"two"=>"B", "three"=>"C", 1=>"one", 2=>"two", "one"=>"A", 3=>"three"}
[[1, "one"], [2, "two"], [3, "three"], ["one", "A"], ["three", "C"], ["two", "B"]]
 
사실 Hash의sort 방법은 하나의 Hash 대상을 [key,value]를 하나의 요소로 하는 하나의 수조로 변환한 다음에 수조의sort 방법으로 정렬하는 것이다.
5.Hash 클래스의 일반적인 방법:
방법
설명
size()
Hash 객체 길이 되돌리기
length()
Hash 객체 길이 되돌리기
include?(key)
지정한 Hash 객체에 지정된 키가 포함되어 있는지 판단합니다.
has_key?(key)
지정한 Hash 객체에 지정된 키가 포함되어 있는지 판단합니다.
delete(key)
Hash 객체에서 지정한 키의 대응 요소 삭제
keys()
Hash 객체의 모든 키로 구성된 배열 반환
values()
Hash 객체의 모든 value로 구성된 배열 반환
e.g.

  student = {
     "name" => "Steve",
     "age" => 22,
     "Gender" => "male"
    }  
  p student.keys              #=> ["name", "Gender", "age"]
  p student.values             #=> ["Steve", "male", 22]
  puts student.include?("age")         #=> true
  puts student.size             #=> 3
  student.delete("Gender")
  puts student.has_key?("Gender")       #=>false
  puts student.size             #=>2
6. Hash 변환 사용
몇 겹으로 박힌hash를 처리할 때 항상 혼란스러워서 읽거나 수정하는 것이 번거롭다.따라서hash를 대상으로 전환하여 키를 직접 생성하는 get/set 방법을 생각하면 코드는 다음과 같다.

class HashObj
 class << self
 def load_from_hash(hash)
  if hash.instance_of? Hash
  obj = HashObj.new
  hash.each{|k,v| obj.send :def_sget_method,k,HashObj.load_from_hash(v)}
  obj
  elsif hash.instance_of? Array
  hash.map{|m| HashObj.load_from_hash(m) }
  else
  hash
  end
 end
 end

 def attributes
 hash = {}
 @@reg ||= /=/
 self.singleton_methods.reject{|x| @@reg =~ x.to_s}.each do |m|
  v = self.send(m)
  if v.instance_of? HashObj
  real_v = v.attributes
  elsif v.instance_of? Array
  real_v = []
  v.each do |l|
   if l.instance_of? HashObj
   real_v << l.attributes
   else
   real_v << l
   end
  end
  else
  real_v = v
  end
  hash[m] = real_v
 end
 hash
 end

 protected
 def def_sget_method(name,val)
 self.instance_variable_set "@#{name}",val

 self.define_singleton_method "#{name}=" do |n_val|
  instance_variable_set "@#{name}",n_val
 end

 self.define_singleton_method name do
  instance_variable_get "@#{name}"
 end
 end
end

데모 사용하기

hash = {name:'jack',age:22,phone:['61900871','8787876'],
    basic_info:{country:'USA',city:'New York'}}
obj = HashObj.load_from_hash hash
obj.name #'jack'
obj.age  #22
obj.phone #['61900871','8787876']
obj.basic_info #<HashObj:0x007f9eda02b360 @country="USA", @city="New York">
obj.basic_info.country #'USA'
obj.attributes == hash #true
obj.age = 30
obj.attributes #{:name=>"jack", :age=>30, :phone=>["61900871", "8787876"],
# :basic_info=>{:country=>"USA", :city=>"New York"}}

좋은 웹페이지 즐겨찾기