주석 : #
정수
: 루비에서 정수는 Fixnum 또는 Bignum 클래스의 객체. Fixnum이 범위를 초과할 때마다, 그 객체는 자동으로 Bignum 객체로 변환된다. Bignum 객체의 범위는 사실상 사용할 수 있는 메모리에 달려있다.
부동소수점
: 1.e3라고 쓰면 Fixnum 클래스의 e3 메서드를 호출하는 것으로 인식하기 때문
이다. 루비 1.8부터는 소수점 앞에도 반드시 숫자를 하나는 둬야 한다.
12.34 → 12.34
-0.1234e2 → -12.34
1234e-2 → 12.34
문자열
a = 123
“\123mile“ → Smile
“Say \“Hello\““ → Say “Hello“
%Q!“I said ‘nuts‘,“ I said! → “I said ‘nuts‘,“ I said
%Q{Try #{a + 1}, not #{a - 1}} → Try 124, not 122
%<Try #{a + 1}, not #{a - 1}> → Try 124, not 122
“Try #{a + 1}, not #{a - 1}“ → Try 124, not 122
%{ #{ a = 1; b = 2; a + b } } → 3
변수/메서드 이름의 모호성 (ruby 구조가 마냥 좋아 보이지만은 않다)
클레멘스 한제(Clemens Hintze)가 올린 아래의 코드 조각은 모호성에 대한 다
소 병적인 예제다.
def a
print “Function ‘a‘ called\n“
99
end
for i in 1..2
if i == 2
print “a=“, a, “\n“
else
a = 1
print “a=“, a, “\n“
end
end
실행 결과:
a=1
Function ‘a‘ called
a=99
분석 중에 루비가 첫 번째 print 문에서 a를 만났을 때는, 아직 a에 대한 대입이
일어난 적이 없기 때문에, 이는 메서드 호출이라고 가정한다. 잠시 후, 두 번째
print 문에 다다랐을 때, 이때는 대입문을 이미 보았으므로, 이는 변수로 여긴다.
class Methods:
함수가 class difinition 밖에 정의되어 있다면 그것은 디폴트로 private이다.
하지만 class Methods는 디폴트로 public이다.
modules :
장점 2가지
1. namespace를 제공, 이름충돌을 막는다
2. mixin 을 구현 할 수 있다.
mixin - ruby는 다중 상속을 지원하지 않는다. 하지만 module을 사용하면 가능하다.
모듈은 인스턴스를 가질 수 없다. 왜냐하면 모듈은 클래스가 아니기
때문이다. 하지만, 클래스 선언에 모듈을 포함(include)할 수 있다. 모듈을 포함하면 이 모듈의 모든 인스턴스 메서드는 갑자기 클래스의 인스턴스 메서드처럼 동작하기 시작한다. 즉, 이 메서드가 클래스에 녹아서 섞여버린(mixed in) 것이다.
믹스인 된 모듈은 실제로는 일종의 상위 클래스처럼 동작한다.
집고 넘어 가자
require : c나 c++의 include와 비슷하다. java의 import와 비슷하다. 3rd program에서 이미 정의된 module을 사용하고 싶을때 module file을 부르기위한 구문이다.
require 'trig.rb'
require 'moral' #moral.rb 파일(.rb를 쓰지 않아도 된다)
include : class 안에서 module을 사용하고 싶을때 사용한다.
1. c개발자의 include와는 다르다. c는 전처리기를 이용하여 코드내용을 추가 시키는 것이지만, ruby의 include는 단지 해당 모듈에 대한 참조를 만들 뿐이다.
모듈이 작업중인 파일에 존재한다? : include 만 쓰면 된다.
아니다? : require 해야 한다.
2. include는 단순히 클래스에 모듈의 인스턴스 메서드를 복사하는 것이 아니
다. 그 대신, include는 클래스에 포함될 모듈에 대한 참조를 만든다. 만일 여러 클래스가 하나의 모듈을 포함할 경우, 이 클래스들은 모두 같은 모듈을 참조하게 된다. 그리고 프로그램 실행할 때 그 모듈의 메서드 정의를 수정하면, 그 모듈을 include하는 모든 클래스는 새로운 동작을 수행할 것이다
(메서드만 그렇다. 인스턴스 변수는 객체마다 고유)
load도 있네.
다른 파일을 포함하기 위해선
load 'aaa.rb'
require 'aaa.rb'
require 'aaa' 로 할 수 있다.
어디 어디 가면 두개의 차이점이 rb를 안써도 되냐 안되냐로 쓰여있었다.
음.. 차이점이라고 하기 매우 무색하다.
조금더 차이점이라 할 수 있는 것은 아래와 같다.
load require 차이점
load 메서드 -> 실행 될 때마다 해당 이름을 가진 루비 소스코드를 포함
require -> 해당 파일을 한번만 로드한다.
module - 조금 뒤에 나왔지만..
module A def a1 end def a2 end end module B def b1 end def b2 end end class Sample include A include B def s1 end end samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
상속
class Test1
a = 3 #지역변수
@aa = 4 #인스턴스 변수. 초기화 되지 않는다(nil이됨 ). initialize로만 가능
@@aaa = 7 #클래스 변수(같은 클래스 안에서만 전역변수)
def initialize(a) #자바 생성자와 같다.
@aa = a
end
def say_hello(name, talk)
puts "hi, #{name}. #{talk} "
end
def print_value
a = 4
puts a, @aa, @@aaa #함수안의 a만 부를 수 있다.
end
end
class Test2 < Test1 #상속
def initialize(a)
super(a) #자바를 아는가? 그것이다. 그러니까 Test1의 initialize
#를 호출한다.
end
end
t1 = Test1.new(7)
t1.say_hello('cozy', 'i hate U')
t1.print_value
puts '--------------------------------'
t2 = Test2.new(5)
t2.print_value
t2.say_hello('ya', 'ne moendea')
[결과]
hi, cozy. i hate U
4
7
7
--------------------------------
4
5
7
hi, ya. ne moendea
계속..
java Vs Ruby 다른점 간단히 써둔 ppt : http://www.slideshare.net/Belighted/ruby-vs-java
'언어&플랫폼 > ruby' 카테고리의 다른 글
[ruby] ruby 배우기 (책 필요 없음), 컴퓨터 언어 배우기 (0) | 2012.10.24 |
---|---|
[ruby]이름 약속 (0) | 2012.10.22 |
[ruby] 설치 및 기본 tools (0) | 2012.10.19 |