본문 바로가기

전체 글131

[Ruby] clone, dup, deep_dup 공통점 : 객체를 복사한다. clone vs dup 비교 clone : 원본은 변경하지 않는다. 싱글톤 클래스를 복사한다. frozen/tainted 상태를 보존한다. dup은 그렇지 않음. dup : 객체의 attributes(내부 상태)는 복사하지 않고 새로운 인스턴스를 반환받는다. dup은 객체를 복사하면 id가 없는 상태로 생성되기 때문에, 기존 객체를 복사해서 새로운 객체로 DB에 저장가능. clone은 id도 복사하기 때문에 똑같이 save했을때 덮어쓰기가 됨. clone/dup vs deep_dup 비교 clone/dup은 내부객체는 복사되지 않았으므로 같은것을 가리킴.(shallow copy) deep_dup은 내부객체도 아예 다름.(deep copy) deep_dup 메소드는 주어진 객체.. 2019. 6. 18.
[Ruby] 외부 파일 참조하기 - require, load, include, extend load는 매번 새롭게 파일을 불러옴 require는 최초 한번만 파일을 불러옴 include는 모듈의 메서드들을 인스턴스 메서드로 불러옴 (User.new.find처럼 호출가능) extend는 모듈의 메서드들을 클래스 메서드로 불러옴(User.find처럼 호출가능) + include와 extend의 차이점 2019. 6. 18.
[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.