1월, 2013의 게시물 표시

임의 객체에 메소드 붙이기

특정한 계산을 반복해서 하는 일이 생겼는데 따로 클래스를 만들기는 귀찮아서 어떻게 할까 고민하던 중 예전에 루비에서는 모든것들이 객체이므로 그 객체에서만 동작하는 메소드를 만들수 있다(혹은 그 비슷한 내용)는 내용을 본 기억이 스멀스멀 떠올랐습니다. 다음은 그 시험입니다. cities =[ [200.0,100.0], [180.9,158.8] ] # cities만의 내부 자료 table 생성 def cities.init @table = {} end # 거리 계산 def cities.distance(from, to) # @table = {} k = "%02x%02x", [from, to] if @table.has_key?(k) puts "using cache!" @table[k] else puts "calculating..." @table[k] = Math.sqrt((self[from][0] - self[to][0])**2 + (self[from][1] - self[to][1])**2) end end cities.init() puts cities.distance(0, 1) puts cities.distance(0, 1) 실행결과는... calculating... 61.82434795450738 using cache! 61.82434795450738 따로 클래스를 작성해도 되지 않느냐고 생각할 수도 있겠지만 기존에 동작하는 코드가 있다면 특별히 손을 많이 대지 않고도 클래스를 작성한 것과 같은 효과를 가져올 수 있을것 같습니다.

에디터계의 갑... Sublime2

이미지
Sublime2는 사용하고 계신 분들이 이미 많이 있겠지만 공부삼아 몇가지 독특한 기능만 적어봅니다. 윈도우즈, OSX, 리눅스 모두를 지원하는데다 파이썬이 내장되어 있어 여러가지 편리한 확장 기능들이 가득한 괴물같은 에디터군요. Emacs와 같은 에디터들이 지원하는 기능을 직접 눈으로 보면서 쓸 수 있어 사용할수록 잘 만들었다는 생각이 드는 에디터입니다. Goto Anything 에디터에서 여러개의 탭을 지원합니다 탭간의 이동은 Ctrl + PgUp/PgDn Ctrl+P 를 누르면 창이 하나 열리는데 여기에 파일 이름, 함수 이름, 열수를 입력하면 바로 지정한 곳으로 이동하게 됩니다 이름은 전체를 다 입력할 필요없이 helloworld.c 라면 hw만 입력해도 찾아줍니다. helloworld.c의 main 함수는 hw@m, helloworld.c의 5번째열은 hw:5와 같이 검색 명령을 조합해서 사용할 수 있습니다 원하는 열로 이동하기 위해서는 : 다음에 숫자를 입력 Multiple Selection 텍스트의 여러곳을 선택하거나 커서를 여러개 사용할 수 있습니다.  커서를 여러개 만든 경우 이동, 입력, 삭제, 선택 등의 명령이 각 커서마다 실행되므로 여러가지로 응용할 수 있습니다. 커서를 여러개 놓고 싶다면 Ctrl 키를 누른채 마우스로 커서를 놓고 싶은 곳을 누르면 됩니다. 키보드에서는 Ctrl + Alt 누른채 화살표 위, 아래를 누르면 커서가 여러개로 늘어납니다. 여러 열을 선택한 다음 Ctrl + Shift + L 키를 누르면 각 열의 가장 끝부분마다 커서가 만들어지게 됩니다. 여러 단어를 한꺼번에 선택하려면 단어에 커서를 위치시킨 후 Alt + F3를 누르면 같은 단어가 모두 선택됩니다. 한번에 한 단어씩 추가하려면 Ctrl + D 를 입력합니다. Sublime 홈페이지의 화면을 한번 만들어 보았습니다. 커서가 일 뒤쪽에 위치한 화면부터 시작해서 키 입력은 다음과 같습니다. ;) 1) Ctrl...

Ruby에서 다차원 배열 초기화

루비의 배열(Array) 초기화 방법은 여러가지가 있습니다만, 크게 Array.new(size, object), Array.new(number) { object } 혹은 [object]*size가 많이 사용됩니다. 일차원 배열인 경우 이들의 차이가 없는 것 같습니다만, 다차원 배열에서는 다음과 같이 차이가 있습니다. Array.new(size, object)와 [object]*size는 한가지 object를 반복해서 사용하게되고 Array.new(number) { object }는 매번 블록이 실행되게 되므로 서로 다른 object를 사용하게 됩니다. 다음과 같은 예를 들수 있겠습니다. 개인적으로 두번째 방법을 자주 사용하는데 다차원 배열을 쓰게 되면 한가지 배열값을 바꾸면 다른 차수의 배열값이 동시에 바뀌는 이상한 동작을 접하게 됩니다. a = Array.new(4, Array.new(3, Array.new(2, nil))) => [[[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]]] a[0][0][0] = 1 a => [[[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]], [[1, nil], [1, nil], [1, nil]]] b = [[[nil]*2]*3]*4 => [[[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]], [[nil, nil], [nil, nil], [nil, nil]]] b[0][0][0] = 1 b => [[[1, nil], [1...