언어&플랫폼/ruby 2012. 10. 26. 14:29

주석 : #

 

정수

: 루비에서 정수는 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

 

posted by cozyboy
: