본문 바로가기

분류 전체보기138

[Ruby] Block vs Proc vs Lambda Block 루비에서 클로저를 사용하는 방법. do~end사이의 코드로 표현됨. 메서드에 블록을 넘겨주는 경우 yield로 실행할 수 있다. &operator를 통해 지역변수 대신 블록에 대한 참조를 인자로 전달 가능 return과 break가 블록 안으로 한정된다. Proc 익명함수(절차)를 담은 객체. call로 호출한다는 차이점이 있음. 블럭에 있는 코드를 여러 곳에서 사용하려고 할 때 사용 값을 반환하면 메서드가 중단됨. proc이 있는 메서드의 최종 반환값은 Proc의 반환값이 됨. code snippet형태로 작동하므로... Lambda 메서드의 매개변수 형태로 코드를 직접 전달. Proc과의 차이점은 매개변수의 갯수가 맞지 않으면 argument에러를 반환함. (Proc은 값 반환하면 메서드를.. 2019. 6. 18.
[Ruby] and vs && (or vs ||) and가 평가 우선순위가 낮다. or/||도 마찬가지의 관계. and는 심지어 =보다도 우선순위가 낮아서 의도대로 사용이 어렵다. ex) a = :a, b = nil result = a and b 이면 result=a가 우선 평가되어 result = :a result = a && b 이면 a&&b가 우선 평가되어 a&&b = nil, result = nil + 무조건 &&이 더 좋은건지? and는 어떨때 사용하는지?는 잘 모르겠음. 2019. 6. 18.
[Ruby] Class와 Module의 차이점 클래스는 객체를 만들기위해 만들고, 모듈은 클래스에 메소드를 제공하기 위해 만든다. 클래스는 말그대로 객체생성을 위해 만드는거고, 모듈은 클래스에서 사용할 기능들을 제공하기 위해 만든다고 생각하면 쉽다. 클래스(객체) 모듈(기능. 사용가능한 메서드를 제공하는 라이브러리 개념) 인스턴스화 가능 불가능 용도 객체생성 믹스인. namespace super class module object 메소드 클래스메소드 & 인스턴스 메소드 모듈 메소드 & 인스턴스 메소드 상속 가능 불가능 include 불가능 다른 클래스나 모듈에서 include가능 extend 불가능 가능 + include와 extend의 차이 module Foo def foo puts 'heyyyyoooo!' end end # include : 모듈.. 2019. 6. 18.
[Ruby] ||= (or equals)란 무엇인가? a || a=b 과 같은 의미이다. 이래도 좀 헷갈리는데, a||=b 일때 a가 nil/false면 b를 대입한다는 의미이다. 반대로 a가 값을 가지고 있거나 true이면 값을 b로 변경하지 않겠다는 의미이기도 하다. 아래와 같은 경우처럼 사용된다. @current_user ||= User.find_by_id(session[:user_id]) : current_user가 없는 경우, 세션에서 가져온 user_id로 유저를 찾아온다. 2019. 6. 18.
[Ruby] 함수를 동적으로 실행하기 동적으로 함수를 실행할 필요가 있을때, send를 사용할 수 있다. 형태 클래스명.new.send(실행할 함수명) ex) class User def find -> User.new.send(:find) 2019. 6. 18.
[Ruby] 인스턴스 변수 인스턴스 변수란? 형태 : @변수명 ex) @current_user 인스턴스에 소속되어 있는 모든 메소드 안에서 사용가능하다. 2019. 6. 18.
[Ruby] 생성자(Constructor) 생성자란? 클래스로부터 인스턴스가 생성될 때(클래스가 인스턴스화 될때) 자동으로 실행되도록 약속된 메소드 ex) class User def initialize() 인스턴스가 생성될때 실행되기를 바라는 코드(초기화해야하는 어떤 작업들)가 있을 때 initialize안에 정의해두면 자동으로 실행해줌 형태 class User def initialize(a,b) # 실행될 코드 end ... a = User.new(a,b) # 예를들어 이런 코드가 실행될 때 initialize가 호출된다. 2019. 6. 18.
[Ruby] self란? 현재 또는 기본객체를 가리킨다. 클래스 안에서 쓰면 현재 클래스를 말하고, 메서드 안에서 쓰면 현재의 메서드를 사용하고 있는 객체를 말함. 특히 클래스 메서드를 표현할 때 많이 쓰인다. 형태 def self.find -> 클래스 메서드 / def find -> 인스턴스 메서드 class User def self.find가 있다고 하면 클래스명.메서드명(User.find)로 호출이 가능함. 하지만 self가 없는 인스턴스 메서드는 u = User.new(유저 인스턴스 생성) 후에 u.find가능. 반대로 클래스 함수를 인스턴스 객체에서 호출하려고 하면 NoMethodError남. User.find만 가능. 그렇다면 인스턴스 메소드는 어떨때 사용하는가? 특정 인스턴스에 의존적인 때에 사용. ex) get/s.. 2019. 6. 18.
[Ruby] symbol과 string의 차이점 string은 데이터, symbol은 식별자 irb(main):001:0> :asdf.object_id == :asdf.object_id => true irb(main):002:0> "asdf".object_id == "asdf".object_id => false symbol의 특징 주로 메서드나 인스턴스 변수명을 표현할때 사용됨 hasy key로 사용되기도 함 immutable함 - 값 변경 불가, 덮어쓰기 가능, heap메모리에 생성되고나면 동일한 객체로 재사용 가능 반면 string은 mutable하므로 실제로는 동일한 값이라 해도 실행시점까지 알수가 없고, 메모리공간도 각각 차지함 그러므로 string보다 메모리 효율성/성능 측면에서 유리하다 2019. 6. 18.