Ruby의 Hash 해시 유형 기본 작동 방법 소결
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"}}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ruby의 단일 메소드 및 단일 클래스 상세 정보단일 방법 Ruby는 단일 객체에만 적용되는 단일 객체 추가 방법을 단일 방법이라고 합니다. 또한 위에서 사용한 정의 방법 외에 Object#define_를 통해singleton_method 방법으로 단일 방법 정의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.