본문 바로가기

TIL/RUBY

(6)
루비 구조와 해석(interpretation) 해당 포스트는 아래의 블로그를 읽고 번역한 글입니다. The Structure and Interpretation of Ruby Programs 루비 프로그램이 실행될 때마다 프로그램은 먼저 토큰으로 변환되고 토큰은 Abstract Syntax Tree로 결합되며 마지막으로 이 AST는 가상머신 명령어로 컴파일 된다. 아래에서 이 세가지 단계에 대해 좀 더 깊게 얘기해볼 예정이다. 먼저 예를 들어보자. class Math def add(x, y) x + y end end Math.new.add(1, 2) 루비 프로그램 돌릴때마다 루비는 문자들을 한 번에 하나씩 훑고 토큰이라 불리는 특변한 단어로 묶는다. 이 토큰들은 유효한 루비라고 보장되지는 않는다. 이 시점에서는 토큰 스트림은 유효하지 않을 수도 있다...
exception error handling 1. 기본 exception handling begin x = 1/0 rescue Exception x = 0 puts( $!.class ) puts( $! ) end puts( x ) -------실행결과------- ZeroDivisionError divided by 0 0 $! 는 마지막에 발생한 exception을 뜻한다. 2. exception타입에 따라 다양한 액션을 취할 수 있다. def calc( val1, val2 ) begin result = val1 / val2 rescue TypeError, NoMethodError => e puts( e.class ) puts( e ) puts( "One of the values is not a number!" ) result = nil rescu..
Encapsulation and Information Hiding encapsulation and information hiding class MyClass def initialize return @test = 500 end end ob = MyClass.new p ob.@test # error 위의 코드는 에러가 발생한다. 인스턴스 변수에 직접 접근하려 했기 때문이다. 내부 데이터에 접속하기 위해선 반드시 메소드를 사용해야한다. 이러한 접근방식의 장점 중 하나는 데이터에 대한 통제가 가능하다는 것이다. 예를 들어 보자. class MyClass def initialize(num) return @test = num end def test if @test < 0 val = 0 else val = @test end return val end end num = 500 ob ..
Argument default argument def aMethod( a=10, b=20, c=100, *d ) return a, b, c, d end def anotherMethod( greeting="Hello", name="friend" ) return "#{greeting}, #{name}" end p( aMethod ) # result : [10, 20, 100, []] p( aMethod( 1,2 ) ) # result : [1, 2, 100, []] p( aMethod( 1,2,3 ) ) # result : [1, 2, 3, []] p( aMethod( 1,2,3,4,6 ) ) # result : [1, 2, 3, [4, 6]] 위와 같은 식으로 디폴트값을 지정할 수 있다. 또한 기존에 선언한 매개변수보다 ..
class method 메소드란 오브젝트에 기능을 제공하는 역할을 합니다. 클래스 메소드 역시 기능을 제공하는 역할을 하며 클래스 그 자체에 대한 기능을 정의합니다. 예를 들어 봅시다. User.find(1) 루비온레일즈를 써보셨다면 익숙한 코드이실겁니다. 액티브레코드의 기능을 통해 유저 테이블에 있는 데이터를 조회하는 코드죠. 저 User모델 역시 클래스입니다. 하지만 User.new를 통해 객체를 생성하지 않은채 클래스명으로 바로 메소드를 호출했죠. 저 때의 find가 바로 클래스 메소드입니다. 이렇듯 클래스 메소드는 객체 생성없이 호출이 가능하며, 각 객체별이 아닌 클래스 전체와 관련된 기능을 정의합니다. 다시 말해, 정의하고자 하는 기능이 각각의 객체에 속하는 것이 아니라면 클래스 메소드로 정의해야 한다는 뜻입니다. 또..
Symbol 뭔지 모르겠지만 뭔가 있어보이니까 그냥 쓰자 루비를 배워본 적 없이 바로 개발에 투입되다보니 항상 '다들 이렇게 쓰니 나도 그냥 쓰자'라는 마인드였습니다 (a.k.a. 노답마인드). 그럼에도 항상 신경쓰이는 놈이 있었는데 바로 symbol입니다. 그냥 생각없이 쓰자니 눈에 너무 많이 띄더군요. 메소드 명이나 해쉬키로 자주 쓰이니 대충 이런 놈이겠지 싶은 감은 있었지만 정작 누군가 물어봤다면 대답을 못할것같았습니다. '상징이야' 라고 대답하기에는 문과인생을 청산한지도 꽤 오래 됐고 아재처럼 보이기도 싫고, 여튼 그랬어요. 이러한 이유로 첫 TIL 주제를 symbol로 정하게 되었습니다. 자 그렇다면, 심볼이란 뭘까요? 심볼이란 변경불가능한(immutable) 상수입니다. 라는 정의를 매번 봐왔습니다. 그때..