본문 바로가기

분류 전체보기100

해시와 친해지기7 오늘은 해시에 저장된 모든 키와 값을 원하는 형태로 변경할 수 있는 transform_keys와 transform_values 메서드부터 만들어 보자. 아래 코드를 보면 두 메서드 모두 each 메서드로 현재 MyHash 객체의 데이터를 하나씩 순회하면서 새로 만들어 놓은 MyHash 객체에 데이터를 추가해 넣는 단순한 로직이다. 다만 transform_keys 메서드는 전달된 블록에 키를 인수로 전달하여 실행한 결괏값을 '키'로 사용하고 transform_values 메서드는 값을 블록에 전달하여 실행한 결괏값을 '값'으로 사용한다는 것만 다르다.class MyHash ...생략 def transform_keys mh = MyHash.new each do |k, v| mh[yie.. 2024. 12. 13.
해시와 친해지기6 오늘은 해시에 존재하지 않는 키로 값을 조회할 때 단순히 nil이 아니라 미리 설정해 놓은 기본값을 전달할 수 있는 기능부터 추가해 보자. 해시에 기본값 설정은 객체를 생성할 때 인수나 블록을 통해서 하거나 default 또는 default_proc 속성의 setter 메서드를 통해서 할 수 있다. 그리고 기본값 설정은 값(default) 또는 코드 실행(default_proc) 중 하나만 가능하다. 이 점을 염두에 두고 아래 코드를 살펴보자. 우선 attr_reader 메서드를 사용하여 default와 default_proc 두 속성의 getter 메서드를 추가하였다. setter 메서드는 직접 정의했는데 인수로 해당 속성의 값을 설정하고 다른 속성의 값은 nil로 초기화 시켜 둘 중 하나만 설정되도록.. 2024. 12. 12.
해시와 친해지기5 이번 글에서는 '해시와 친해지기' 세 번째 글에서 작성했던 MyHash 클래스를 좀 더 발전시켜 보려고 한다. 아래 MyHash 클래스의 코드가 있다. 현재 외부에서 사용할 수 있도록 만들어 놓은 메서드는 [] 연산자와 []= 연산자 두 개뿐이다.class MyHash Entry = Struct.new(:key, :value) def initialize @bucket_cnt = 10 @bucket_list = Array.new(@bucket_cnt) { [] } end def [](key) bucket, entry = bucket_and_entry(key) entry.value if entry end def []=(key, value) bucket, entry.. 2024. 12. 11.
해시와 친해지기4 이번 글에서는 해시의 키로 사용할 수 있는 객체의 클래스를 직접 만들어 보려고 한다. 아래 Person 클래스의 코드를 보면 name과 birthday 두 개의 속성을 초기화할 수 있는 initialize 메서드를 정의하였고, attr_reader를 사용하여 두 속성에 대한 getter 메서드를 추가하였다.class Person attr_reader :name, :birthday def initialize(name, birthday) @name = name @birthday = birthday endend아직 Person 클래스에 hash 메서드와 eql? 메서드를 정의하지 않았는데, 우선 현재의 코드 상태로 Person 클래스의 객체를 해시 키로 사용하면 어떻게 되는지 살펴보자. 테스트.. 2024. 12. 4.