| ÇÁ·Î±×·¡¹Ö ·çºñ | UserPreferences |
ÇÁ·Î±×·¡¹Ö ·çºñ (Pick-Axe: Programming Ruby) 2ÆÇ
![]() |
1ºÎ ·çºñ ±âº» ´ÙÁö±â
1Àå ·çºñ ½ÃÀÛÇϱâ
ÇѱÛ
http://myruby.net
http://www.ruby-lang.org/ko
http://forum.rubykr.org
¿µ¹®
http://rpmfind.com
http://rubyinstaller.rubyforge.org
http://ruby-lang.org
ÀÌ Ã¥ÀÇ ÄÚµå
http://pragmaticprogrammer.com/titles/ruby/code
·çºñ ¹®¼È µµ±¸
RDoc, ri
http://www.ruby-doc.org
2Àå Ruby.new
¹¹µçÁö °´Ã¼
¹®ÀÚ¿ ¹®ÀÚ ¼ýÀÚ º¯¼ö »ó¼ö °¡¸±°Í ¾øÀÌ ÀüºÎ °´Ã¼ ¸Þ¼µå
def
~~
end
¹®ÀÚ¿ ºÎÈ£
' (single-quoted) ±×³É ¹®ÀÚ¿
" (double-quoted) º¯È¯ ¹®ÀÚ¿
"»ì¶ó»ì¶ó \n #{º¯¼ö}"
| Áö¿ªº¯¼ö, ¸Þ¼µå Çü½ÄÀμö, ¸Þ¼µå À̸§ | ¼Ò¹®ÀÚ³ª ¹ØÁÙ(_)·Î ½ÃÀÛ |
| Àü¿ªº¯¼ö | $·Î ½ÃÀÛ |
| ÀνºÅϽº º¯¼ö(¸â¹ö º¯¼ö) | @·Î ½ÃÀÛ |
| Ŭ·¡½º º¯¼ö | @@·Î ½ÃÀÛ |
| »ó¼ö, Ŭ·¡½º À̸§ | ´ë¹®ÀÚ·Î ½ÃÀÛ |
·çºñ´Â Ŭ·¡½º¿¡ ´ÝÇôÀÖÁö ¾Ê´Ù.
À̿Ͱ°Àº ³»¿ëÀº
¸¶Âù°¡Áö·Î Ãà¾àÇüµµ Á¸Àç
Á¸ÀçÇÏÁö ¾Ê´Â ÀνºÅϽº º¯¼ö¿¡ ´ëÇÑ ¼Ó¼ºÀ» ¸¸µé°íÀÚ ÇÑ´Ù¸é
¹è¿
a = ["À̰Í","Àú°Í",30000, ...]
¹è¿ ³»¿ëÀÌ ¹®ÀÚ¿¸¸ ¿Â´Ù¸é?
a = %w{ÀÌ°Í Àú°Í ... } # µû¿ÈÇ¥ »ý·« °¡´É
¹è¿ Á¢±Ù
a[0] -> À̰Í
a[1] -> Àú°Í
a[3] -> 30000
...
ÇØ½Ã
a = { 'ÿ·Î' => 'Çö¾Ç±â', 'Ŭ¶ó¸®³Ý => '°ü¾à±â' , ...}
Ű => °ª ÇüÅÂ ÇØ½Ã Á¢±Ù
a['ÿ·Î'] -> Çö¾Ç±â
...
Á¦¾î¹®
if ~ elsif ~ else ~ end
while ~ end
for ÃʱâÈ in ¹üÀ§(¿¹, 0 ... ¹è¿º¯¼ö.length) ~ end
nil Àº null&falseÀÇ ÀǹÌ
±¸¹® º¯°æÀÚ(statement modifier)
: Á¦¾î¹® ÇÑÁÙ·Î ¾²±â
¿¹)
if radiation > 3000
puts "À§Çè °æ°í µ¥ÀÎÀú À¸¾Ç"
end
¿¹2)
puts "À§Çè °æ°í µ¥ÀÎÀú À¸¾Ç" if radiation > 3000
¹Ýº¹¹®µµ ¸¶Âù°¡Áö
abc = abc*abc while abc > 3000
Á¤±ÔÇ¥Çö½Ä(Regular expressions) ³»Àå Áö¿ø
/ ... / # ½½·¡½¬¿Í ½½·¡½¬ »çÀÌ ºí·Ï°ú ¹Ýº¹ÀÚ
ÄÚµå ºí·Ï(code blocks)Àº { ... } ³ª do ... end ¸¦ ¶æÇÔ
Áß°ýÈ£´Â do ... end º¸´Ù ¿ì¼±¼øÀ§°¡ ³ô´Ù.
ÇÑÁÙ¿¡´Â Áß°ýÈ£¸¦ ¿©·¯ÁÙÀº do ... end¸¦ yield¹®
yield´Â ÄÚµåºí·ÏÀ» ´ëüÇÑ´Ù.
ÄÚµå ºí·° ³»ÀÇ {| ... , ... | ... }ÀÇ ³»¿ëÀº yield¸¦ ¸¸³¯¶§ ÀÎÀÚ·Î½á ´ëüµÈ´Ù.
¿¹)
a = %w {°³¹Ì ¹ú °í¾çÀÌ °í¾çÀÌ ¿¤Å©}
a.each {|animal| puts animal}
¿¹2)
3.upto(6) {|i| print i}
5.times {print "a"}
I/O
puts, gets, printf ÀüºÎ CÀÇ stdio.hÀÇ ÇÔ¼ö¿Í ±â´ÉÀÌ °°´Ù. 3Àå Ŭ·¡½º, °´Ã¼, º¯¼ö
class Song
def initialize(name, artist, duration) #new¸Þ¼µå´Â »ý¼ºÀÚÀÇ ¿ªÇÒ°ú µ¿½Ã¿¡ Ŭ·¡½ºÀÇ initialize¸Þ¼µå¿Í ¿¬°áÀÌ µÈ´Ù.
@name = name
@artist = artist
@duration = duration
end
end
Ŭ·¡½º ÀνºÅϽº »ý¼º½Ã
song = Song.new("·ê·ç¶ö¶ó", "±èÇü±Õ", 20)
song.inspect -> #<Song:0x1c7ca8 @name="·ê·ç¶ö¶ó", "±èÇü±Õ", 20> #inspect ¸Þ¼µå´Â °´Ã¼ÀÇ ID¿Í ÀνºÅϽº º¯¼ö¸¦ Ãâ·ÂÇÑ´Ù.
Ãß°¡ÀûÀ¸·Î ¸Þ¼µå¸¦ »ý¼ºÇϰíÀÚ ÇÑ´Ù¸é,
class Song
def to_s
"Song : #@name -- #@artist (#@duration)"
end
end
»ó¼Ó
class KaraokeSong < Song
def initialize(name, artist, duration, lyrics)
super(name, artist, duration)
@lyrics = lyrics
end
end
Àб⠰¡´É ¼Ó¼º(property)
class Song
def name
@name
end
def artist
@artist
end
end
class Song
attr_reader :name, :artist # :artistÀÇ Àǹ̴ º¯¼öartistÀÇ °ªÀÇ ³»¿ëÀÌ ¾Æ´Ñ À̸§(·¹ÆÛ·±½º?)¿¡ ÇØ´çÇÏ´Â Á¢±Ù.
end
À¸·Î Ãà¾à °¡´É
song = Song.new("LOVEHURT","±èÇü±Õ",200)
song.name -> "±èÇü±Õ"
µÑ´Ù Á¢±Ù ¹æ¹ýÀº °°À½ ¹Í½ºÀÎ
·çºñ¿¡¼ ´ÙÁß »ó¼ÓÀ» ±¸ÇöÇÑ ¹æ¹ý
´ÙÁß »ó¼ÓÀÇ ¸ðÈ£ÇÔÀÇ °áÁ¡À» ´ÜÀÏ »ó¼Ó¿¡ ¹Í½ºÀÎ ÇÏ´Â ¹æ¹ýÀ» Ãß°¡ÇÔÀ¸·Î ´ÜÁ¡¾øÀÌ ÃëÇÔ ¾²±â °¡´É ¼Ó¼º
class Song
def duration=(new_duration)
@duraion = new_duration
end
end
ÀÌÁ¦ºÎÅÍ ¾²±âµµ °¡´É
class Song
attr_writer :duration
end
À§ÀÇ def ~ end ±¸¹®À¸·Î Àбâ¿Í ¾²±â¿¡ ´ëÇÑ ¼Ó¼ºÀ» ¸¸µé¸é µÈ´Ù. Ŭ·¡½º º¯¼ö
Ŭ·¡½ºÀÇ ¸ðµç °´Ã¼°¡ °øÀ¯Çϸç, Ŭ·¡½º ¸Þ¼µå¿¡¼µµ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
½ºÅÂÆ½(static) º¯¼ö¿Í À¯»ç
Ç¥Çö¹ýÀº @@º¯¼öÀ̸§ °ú °°ÀÌ »ç¿ëµÈ´Ù.
Ŭ·¡½º º¯¼ö´Â ±× Ŭ·¡½º¿Í ÀνºÅϽº¿¡°Ô privateÀÌ´Ù.
²À Á¢±ÙÇϰíÀÚ ÇÑ´Ù¸é Á¢±ÙÀÚ ¸Þ¼µå¸¦ ¸¸µé¸éµÈ´Ù. Ŭ·¡½º ¸Þ¼µå
¸¶Âù°¡Áö·Î ½ºÅÂÆ½ ¸Þ¼µå
Ŭ·¡½ºÀ̸§.Ŭ·¡½º¸Þ¼µå ·Î Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
class Song
def Song.AllShow
...
end
end
½Ì±ÛÅæ
new ¿¬»êÀÚ¸¦ privateÀ¸·Î ¼³Á¤ÇÏ¿© ÁÖ¸é µÈ´Ù.
ÇöÀç ¹æ¹ýÀº ½º·¹µå ¾ÈÁ¤¼ºÀ» º¸ÀåÇÏÁö ¸øÇÏÁö¸¸ µÚ¿¡(p.920)¿¡ ½Ì±ÛÅæ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.
class MyLogger
private_class_method :new
@@logger = nil
def MyLogger.create
@@logger = new unless @@logger
@@logger
end
end
| Public ¸Þ¼µå | ´©±¸³ª È£Ãâ°¡´ÉÇÏ´Ù. ·çºñ¿¡¼´Â ±âº»ÀûÀ¸·Î publicÀÌ´Ù. (intialize¸¸ ¿¹¿ÜÀûÀ¸·Î private) |
| Protected ¸Þ¼µå | °´Ã¼¸¦ Á¤ÀÇÇÑ Å¬·¡½º¿Í ÇÏÀ§ Ŭ·¡½º¿¡¼ È£Ãâ °¡´É.¡Ú°°Àº Ŭ·¡½ºÀÇ ÀνºÅϽº °´Ã¼¶ó¸é È£Ãâ °¡´É |
| Private ¸Þ¼µå | ¼ö½ÅÀÚ¸¦ ÁöÁ¤Çؼ È£ÃâÇÒ ¼ö ¾ø´Ù. ¼ö½ÅÀÚ´Â Ç×»ó selfÀÌ´Ù. |
Á¢±Ù Á¦¾î ±â¼úÇϱâ
class MyClass def method1 // ±âº»°ªÀº public end protected // ÀÌ ´ÙÀ½ÀººÎÅÍ´Â protected def method2 end private // ÀÌ ´ÙÀ½ºÎÅÍ´Â private def method3 end public // ÀÌ ´ÙÀ½ºÎÅÍ´Â ´Ù½Ã public def method4 end private :method1 // µÚ¿¡ ´Ù½Ã Á¢±Ù ±ÇÇÑÀ» Á¦¾îÇÒ ¼ö ÀÖ´Ù. protected :method4 end
¹è¿ÀÇ ¿ª¹æÇâ À妽º º¯¼ö
º¯¼ö´Â °´Ã¼¿¡ ´ëÇÑ ÂüÁ¶¸¦ °¡Áø´Ù.
person1 = "Tim" # ¹®ÀÚ¿ °´Ã¼¸¦ »ý¼º
person1[0] = 'J'
person1 -> "Jim"
°á±¹ º¯¼ö´Â °´Ã¼ÀÇ º°¸í(alias)¸¦ °¡Áö°í ÀÖÀ»»Ó´Ù.
person2 = person1 # ´Ü¼øÇÑ alias¸¦ Çϳª ´õ »ý±æ»ÓÀÌ´Ù. °´Ã¼ ÀÚü´Â ÀÚü Ç®(ÈüÀ¸·Î ±¸¼º?)·Î °ü¸®µÈ´Ù.
object.dup¿Í °°Àº ¸Þ¼µå´Â °´Ã¼¸¦ º¹»ç½ÃŲ´Ù.
person1.freeze # °´Ã¼¿¡ ´ëÇÑ ¼öÁ¤À» Á¦ÇÑÇÑ´Ù.
person1[0] = 'A' -> TypeError ¿¹¿Ü¸¦ ¹ß»ýÇÑ´Ù. can't modify frozen string
4Àå ÄÁÅ×À̳Ê, ºí·Ï, ¹Ýº¹ÀÚ
¹è¿(Array)
»ý¼º½Ã
a = ... , ... ? # ¹è¿ »ý¼º°ú Ãʱâȸ¦ µ¿½Ã¿¡
a = Array.new # ¹è¿ »ý¼º½Ã, ÃʱâÈ ÇÊ¿ä
| 0 | 1 | 2 | 3 | 4 |
| -5 | -4 | -3 | -2 | -1 |
Àбâ¿ë [] ¿¬»êÀÚ
¾²±â¿ë []= ¿¬»êÀÚ
astartindex, count?·Î Á¢±Ù °¡´É
ƯÁ¤À§Ä¡ÀÇ À妽º¿¡ ¾²±â¸¦ ½ÃµµÇÒ ¶§ ±× À妽º ¹øÈ£ Àü±îÁö´Â nil·Î ä¿öÁø´Ù.
»ý¼º½Ã
¹è¿°ú ´Ù¸¥Á¡Àº À妽º·Î ¼ýÀÚ¿ÜÀÇ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â Á¡
¼Ò½ºÄڵ忡¼ ºí·ÏÀº ¸Þ¼µå È£Ãâ ¹Ù·Î µÚ¿¡ ³ªÅ¸³´Ù. °°Àº ÁÙ¿¡ Á¸ÀçÇÏ¸ç ºí·Ï¾ÈÀÇ ÄÚµå´Â ³ªÅ¸³ªÀÚ¸¶ÀÚ ½ÇÇàµÇ´Â°Ô ¾Æ´Ï¶ó ·çºñ°¡ ±× ºí·ÏÀÌ ³ªÅ¸³¯¶§(Áö¿ªº¯¼ö, ÇöÀç °´Ã¼µî)À» ±â¾ïÇÏ°í ¸Þ¼µå°¡ ½ÇÇàµÇ¸é¼ yield¹®À» ¸¸³¯¶§ ºí·ÏÀÇ ³»¿ëÀ» ½ÇÇàÇÑ´Ù. ±×¸®°í ºí·Ï ÀÚü¿¡ Çü½ÄÀμö¸¦ °¡Á® ÀÎÀÚ¸¦ °¡Áö´Â ÀÛÀº ÇÔ¼ö¿Í °°ÀÌ ½ÇÇàµÈ´Ù.
Á¤¼ö´Â ±æÀÌ »ó°ü¾øÀÌ »ç¿ë °¡´É. (½Ã½ºÅÛ ¸Þ¸ð¸®°¡ ¹ÞÃÄÁÖ´ÂÇÑ)
ÇØ½Ã(Hash)
Ű¿Í °ªÀ¸·Î °ü¸®
a = {Ű => °ª, ...} ÄÚµå ºí·Ï
C++, Java, C# °ú´Â ¾ÆÁÖ ´Ù¸£´Ù. ¹Ýº¹ÀÚ
each Çϳª¾¿ ¹Ýº¹Çؼ ¹ÝȯÇÑ´Ù.
collect Çϳª¾¿ ¹Ýº¹Çؼ ¹ÝȯÇÑ °á°ú°ªÀ» ¹¾î¼ ¹è¿·Î ¸¸µç´Ù.
inject µÎ°³ÀÇ ÀÎÀÚ¸¦ °¡Áö°í ù¹øÂ° ÀÎÀÚ´Â ¸ðÀ¸´Â(inject) °ª µÎ¹øÂ° ÀÎÀÚ´Â ¹Ýº¹Çؼ ¹ÝȯÇÑ °ªÀÌ µÈ´Ù.
¹Ýº¹ÀÚ´Â ´Ü¼øÈ÷ ¸Þ¼µåÀ̸ç, ´Ù¸¥ ¸Þ¼µå¿Í ´Ù¸¦ ¹Ù ¾ø°í, »õ·Î¿î °ªÀ» À§ÇØ yield¸¦ È£ÃâÇÑ´Ù. ¹Ýº¹ÀÚÀÇ ÁÖü´Â ¹Ù·Î ¸Þ¼µå¿Í °áÇÕµÈ ÄÚµå ºí·ÏÀÌ´Ù. ¸Þ¼µå Çü½ÄÀμö ³Ñ±â±â?
¸Þ¼µåÀÇ Á¤ÀǺκп¡ (*args)¿Í °°ÀÌ ÀÎÀÚ¸¦ ¼³Á¤ÇØ Áشٸé
½ÇÁ¦ ¸Þ¼µå È£ÃâÇÒ¶§ µé¾î¿Â ÀÎÀÚ´Â Åõ¸íÇÏ°Ô args¶ó´Â À̸§À» °¡Áö°í ±×´ë·Î ´Ù¸¥ ¸Þ¼µå¿¡ ³Ñ°Ü ÁÙ ¼ö ÀÖ´Ù. Æ®·£Á§¼Ç
FileŬ·¡½ºÀÇ Open¸Þ¼µå´Â ÄÚµåºí·ÏÀ» Ãß°¡ÇÔÀ¸·Î ½ÇÁ¦ ÇൿÀ» ½ÇÇà½Ã¿¡ Ãß°¡ÇÑ´Ù.
¹®Á¦´Â Open¸Þ¼µåÀÇ È£ÃâÀÌ ³¡³²°ú µ¿½Ã¿¡ ¿·ÁÀÖ´Â ÆÄÀÏÀ» ´Ù½Ã CloseÇØÁÖ´Â Æ®·£Á§¼ÇÀÌ Æ÷ÇԵǾî Àִµ¥
¸¸ÀÏ ÄÚµåºí·ÏÀÌ Ãß°¡µÇÁö ¾Ê´Â´Ù¸é ¿·ÁÀÖ´Â »óŸ¦ À¯ÁöÇÏ°Ô ¸¸µé¾îÁØ´Ù.
±¸Çö ³»¿ëÀº
Kernel.block_given? ¸Þ¼µå¸¦ ÀÌ¿ëÇØ¼ ÇöÀç ¸Þ¼µå¿¡ ºí·ÏÀÌ °áÇյǾî ÀÖ´Ù¸é true¸¦ ¹ÝȯÇÑ´Ù.] ÄÚµåºí·Ï ³Ñ±â±â?
¸Þ¼µåÀÇ ÀÎÀÚ¿¡ &º¯¼ö¸í À¸·Î ¼³Á¤ÇÏ¿© ÁÖ¸é µÚÀÇ ÄÚµåºí·ÏÀ» ã¾Æ ÀÎÀÚ¿Í ¿¬°áÇÏ¿© ÁØ´Ù. Proc °´Ã¼
º¯¼ö·Î ¾î¶² °´Ã¼ÀÇ ¸Þ¼Òµå¸¦ ¹ÞÀ¸¸é ¾î¶»°Ô µÉ±î?
À̰ÍÀ» Proc °´Ã¼¶ó°í Çϴµ¥ ÀÌ °´Ã¼´Â Á¤ÀÇµÈ ½ÃÁ¡¿¡¼ ¸ðµç ¹®¸Æ Á¤º¸¸¦ °®´Â´Ù.
Áï, self°ª°ú ¹üÀ§³»ÀÇ ¸Þ¼µå, º¯¼ö, »ó¼ö¸¦ Æ÷ÇÔÇÑ´Ù. ´Ù¸¥ ¾ð¾î¿¡¼´Â Ŭ·ÎÀú(closure)¶ó°í ºÎ¸£´Â Ư¡ÀÌ´Ù.
Proc°´Ã¼¿¡ ÇÒ´çµÈ ¸Þ¼µå¸¦ ½ÇÇàÇϱâ À§Çؼ´Â Proc#call ¸Þ¼µå¸¦ »ç¿ëÇÑ´Ù. 5Àå Ç¥ÁØ Å¸ÀÔ
¼ýÀÚ
Á¤¼ö ¿Í ºÎµ¿¼Ò¼öÁ¡ À» Áö¿ø
ÀÏ¹Ý ÀûÀÎ ¹üÀ§ (-2^30 ~ 2^30-1 ¶Ç´Â -2^62 ~ 2^62-1)´Â ³»ºÎ¿¡¼ FixnumŬ·¡½ºÀÇ °´Ã¼°¡ µÇ°í
ÀÌ ¹üÀ§¸¦ ³Ñ¾î¼´Â ¼ýÀÚ´Â Bignum Ŭ·¡½ºÀÇ °´Ã¼·Î ÀúÀå
| Áø¹ý | ¼ýÀÚ¾ÕÀÇ ¹®ÀÚ |
| 8Áø¹ý | 0 |
| 10Áø¹ý | 0d(±âº»°ª) |
| 16Áø¹ý | 0x |
| 2Áø¹ý | 0b |
Á¤¼öµé »çÀÌÀÇ ¹ØÁÙÀº ¹«½ÃÇÑ´Ù. (123 == 12_3)
Á¦¾î ¹®ÀÚ
?\ÀÇ ÇüÅ·ΠǥÇöÇÑ´Ù.
?a -> 97 # ¾Æ½ºÅ°¹®ÀÚ
?\n -> 10 # °³Ç๮ÀÚ0x0a
?\C-a -> 1 # ÄÁÆ®·Ñ a = ?A & 0x9f = 0x01
?\C-x -> # ÄÁÆ®·Ñ x = ?x & 0x9f
?\M-x -> # ¸ÞŸ¹®ÀÚ x = ?x | 0x80 Àß ¸ð¸£°Í´Ù.
¼Ò¼öÁ¡À̳ª Áö¼ö¸¦ Æ÷ÇÔÇÏ´Â ¼ýÀÚ ¸®ÅÍ·²Àº Float °´Ã¼·Î º¯È¯µÈ´Ù.
¼ýÀÚ¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ¿Àº ¼ýÀÚ·Î ¹Ù²îÁö ¾È´Â´Ù.
"3" Àº ¼ýÀÚ3°ú ¾ö¿¬È÷ ´Ù¸£´Ù.
Interger("3")À» ÅëÇØ º¯È¯À» ½ÃÄÑÁà¾ß ÇÑ´Ù.
ÀÛÀº µû¿ÈÇ¥ ³»ÀÇ ¹®ÀÚ¿Àº
Å« µû¿ÈÇ¥ ³»ÀÇ ¹®ÀÚ¿Àº ´õ ¸¹Àº À̽ºÄÉÀÌÇÁ ½ÃÄö½º¸¦ Áö¿øÇÑ´Ù.
ÀÌ ¿Ü¿¡ ¹®ÀÚ¿À» ¸¸µå´Â ½ºÆ®¸µ ¸®ÅÍ·²Àº ¼¼°¡Áö°¡ ´õ ÀÖ´Ù.
È÷¾î µµÅ¥¸ÕÆ®(here document)
¸Þ¼µå µÚ¿¡ ºÙ´Â !´Â ¼ö½ÅÀÚ¸¦ ÀÚ±â ÀÚ½ÅÀ¸·Î Çϰڴٴ ǥÇö
½ÃÄö½º¸¦ ¸®½ºÆ® ÇüÅ·Π¸¸µé¶§ to_a ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
¹üÀ§´Â ±¸¼º ¿ä¼Ò¸¦ ¹Ýº¹ÇÏ´Â ¸Þ¼µå¿Í ³»¿ëÀ» ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î °Ë»çÇÏ´Â ¸Þ¼Òµå¸¦ Áö¿øÇÑ´Ù.
°´Ã¼ ´ÜÀ§¿¡¼µµ ¹üÀ§¸¦ Áö¿øÇϴµ¥
Á¶°Ç¹®¿¡ ¹üÀ§¸¦ ³ÖÀ» ¼öµµ ÀÖ´Ù.
¾î¶²°ªÀÌ ¹üÀ§¿¡ Æ÷ÇÔÇÏ´ÂÁö === µ¿µî ¿¬»êÀÚ·Î Å×½ºÆ® ÇÒ ¼ö ÀÖ´Ù.
¼ö½ÅÀÚ¸¦ »ý·«Çϸé, ±âº»°ªÀº self°¡ µÇ°í ÀÌ´Â ÇöÀç °´Ã¼¸¦ ³ªÅ¸³½´Ù.
¸ðÈ£ÇÑ Ç¥ÇöÀÌ ¾Æ´Ï¶ó¸é ¸Þ¼µå È£Ãâ½Ã ¸Å°³º¯¼ö ¸®½ºÆ®¸¦ °¨½Ñ °ýÈ£¸¦ »ý·«Çصµ µÈ´Ù.(¸Þ¼µå À̸§°ú °ýÈ£»çÀÌ¿¡ °ø¹éÀº Çã¿ëÄ¡ ¾Ê´Â´Ù.)
returnµµ »ý·«Çصµ µÈ´Ù.
ºí·ÏÀº do~end±¸¹®°ú °°À¸³ª ¿ì¼±¼øÀ§¸¸ ³ô´Ù.
·çºñ¿¡´Â ÀÚµ¿ Áõ°¡ ¿¬»êÀÚ(++,--)´Â ¾ø´Ù. ¹®ÀÚ¿
8ºñÆ® ¹®ÀÚÀÇ ½ÃÄö½º´Ù.
¸ðµç ¹®ÀÚ¿Àº String Ŭ·¡½ºÀÇ °´Ã¼ÀÌ´Ù.
\\Àº \ ·Î ÀνÄÇϰí
\'Àº ' À¸·Î ÀνÄÇÑ´Ù.
\n \t µîÀÇ À̽ºÄÉÀÌÇÁ ½ÃÄö½º¸¦ Áö¿øÇϰí
#{expr}°ú °°Àº ½ÄÀ¸·Î ¾²¸é ·çºñ ÄÚµåÀÇ °á°ú¸¦ ¹®ÀÚ¿·Î º¯È¯ÇØ ÁØ´Ù.
#{}¾ÈÀÇ Ç¥Çö½ÄÀÌ Àü¿ªº¯¼ö, Ŭ·¡½ºº¯¼ö, ÀνºÅϽºº¯¼ö¶ó¸é Áß°ýÈ£¸¦ »ý·«Çصµ µÈ´Ù.
expr¿¡´Â ´Ü¼øÇÑ º¯¼ö¸í »Ó¾Æ´Ï¶ó ÇÑÁÙ ÀÌ»óÀÇ ¸í·É¹®ÀÌ ¿Ã ¼öµµ ÀÖ´Ù.
%q/¹®ÀÚ¿/ -> ÀϹÝÀûÀÎ ÀÛÀº µû¿ÈÇ¥ ¹®ÀÚ¿°ú °°´Ù.
%Q!¹®ÀÚ¿! -> ÀϹÝÀûÀÎ Å« µû¿ÈÇ¥ ¹®ÀÚ¿°ú °°´Ù.
%Q{or(or< ¹®ÀÚ¿ >or)or} -> °¢°¢ ´ëÀÀÇϴ ¦ÀÇ ´Ý´Â ¹®ÀÚ°¡ ³ª¿Ã¶§±îÁö °è¼Ó ¹®ÀÚ¿·Î 󸮵ȴÙ.
±¸ºÐ¹®Àڷδ ¾ËÆÄºª, ¼ýÀÚ, 2¹ÙÀÌÆ®¹®ÀÚ¸¦ Á¦¿ÜÇÑ ¾î¶²°ªÀ̳ª »ç¿ëÇÒ ¼ö ÀÖ´Ù.
<<´ÙÀ½¿¡ ƯÁ¤ ¹®ÀÚ¿ÀÌ ¿À´Â Á¾°á¹®ÀÚ¿À» Á¤ÀÇÇÑ´Ù.
´Ù½Ã Á¾°á¹®ÀÚ¿ÀÌ ³ª¿Ã¶§ ±îÁö ÀüºÎ(Áٹٲ޵µ »ó°ü¾ø´Ù.) ¹®ÀÚ¿·Î 󸮵ȴÙ. ¹®ÀÚ¿ ´Ù·ç±â
¸Þ¼µå
String#chomp °³Ç๮ÀÚ(\n,\r)¸¦ ±¸ºÐÀÚ·ÎÇÑ split
String#split ÁöÁ¤µÈ ±¸ºÐÀÚ·Î ³ª´®
String#squeeze ¹Ýº¹µÇ´Â ¹®ÀÚ Á¦°Å ¹üÀ§ ½ÃÄö½º
object1 .. object2 # °æ°è¸¦ Æ÷ÇÔÇÏ´Â ½ÃÄö½º
object1 ... object2 # Á¾·á°ªÀ» Æ÷ÇÔÇÏÁö ¾Ê´Â ¹üÀ§ÀÇ ½ÃÄö½º
(1..10).to_a
#include?()
#min
#max
#reject{}
#each{}
´ÙÀ½ °´Ã¼¸¦ ¹ÝȯÇÏ´Â succ°ú <=> ºñ±³ ¿¬»êÀÚ¸¦ Áö¿øÇØ¾ß ÇÑ´Ù.
puts line if line =~ /start/ .. line =~ /end/
(0..10) === 5 -> true Á¤±Ô Ç¥Çö½Ä
Á¤±Ô Ç¥Çö½ÄÀº µû·Î °øºÎ 6Àå ¸Þ¼µå
ù±ÛÀÚ¸¦ ´ë¹®ÀÚ·Î ½áµµ ´çÀåÀº ¿¡·¯³ªÁö´Â ¾ÊÁö¸¸ ·çºñ°¡ ÀÌ À̸§À» ¸Þ¼µå°¡ ¾Æ´Ï¶ó »ó¼ö¿¡¼ ¸ÕÀú ã±â ¶§¹®¿¡, °á°úÀûÀ¸·Î ¸Þ¼µå È£ÃâÀÌ ¿øÄ¡¾Ê´Â ½ÄÀ¸·Î ºÐ¼®µÉ ¼öµµ ÀÖ´Ù. ¸Þ¼µå ¸í·ÉÀÚ !, ?
¿¹) instance_of? , chop! ¸Þ¼µåÀÇ ÀÎÀÚ
def ¸Þ¼µå¸í #¸Þ¼µå ÀÎÀÚ°¡ ¾øÀ»¶§
~
end
def ¸Þ¼µå¸í(ÀÎÀÚ1, ÀÎÀÚ2, ... )
~
end
def ¸Þ¼µå¸í(ÀÎÀÚ1 = ±âº»°ª1, ÀÎÀÚ2 = ±âº»°ª2 , ...) # ÀÌ·± ¹æ¹ýµµ °¡´É
~
end
°¡º¯ ÀÎÀÚ ¸®½ºÆ®
°¡º¯ Çü½Ä Àμö À̸§ ¾Õ¿¡ *¸¦ ºÙ¿©ÁÜ
def varags(arg1, *rest)
"Get #{arg1} and #{rest.join(', ')}"
end
¸Þ¼µå¿Í ºí·Ï
¸Þ¼µå ³»ºÎÀÇ yield¸¦ ÀÌ¿ëÇØ¼ ¸Þ¼µå È£Ãâ½Ã ºí·Ï°ú °áÇÕÇÑ´Ù.
¸Þ¼µåÀÇ ¸¶Áö¸· Çü½Ä Àμö ¾Õ¿¡ ¾ÚÆÛ»÷µå('&')°¡ ºÙ¾î ÀÖ´Ù¸é, ÀÌ ¸Þ¼µå È£Ãâ¿¡ °áÇÕµÈ ºí·ÏÀº Proc°´Ã¼·Î ¹ÝȯµÇ¾î Çü½ÄÀμö¿¡ ´ëÀԵȴÙ. ¸Þ¼µåÀÇ È£Ãâ
¼ö½ÅÀÚÀÇÀ̸§ ¸Þ¼µåÀÇÀ̸§ ÇÊ¿äÇѰæ¿ì¸Å°³º¯¼ö ºí·Ï ÇØ½Ã·Î ÀÎÀÚ¸¦ ¸ðÀ¸±â
ÀÎÀÚ¸¦ ÇØ½Ã·Î ³Ñ°ÜÁÙ¶§ ,À» ÅëÇØ ±¸ºÐÀ» ÇÏ´õ¶óµµ ÇϳªÀÇ ÇØ½Ã·Î Æ÷ÇÔÀ̵ȴÙ. 7Àå Ç¥Çö½Ä
´ëºÎºÐÀÇ ¾ð¾î¿¡¼´Â Ç¥Çö½Ä(expression)À̶ó°í Çϸé, ÇϳªÀÇ °ªÀ» ¸¸µé¾î ³»´Â ¿¬»êÀ» ÀǹÌÇÑ´Ù.(3À» ¸¸µé±â À§ÇÑ 1+2) ±×¸®°í Ç¥Çö½ÄÀ» ÀÌ¿ëÇØ¼ ±¸¹®(statement)¸¦ ±¸¼ºÇÑ´Ù.(result = 1+2)
·çºñ¿¡¼´Â ´ëÀÔ¹®µµ °á°ú¸¦ ¹ÝȯÇÑ´Ù. °ÅÀÇ ¸ðµç °ÍÀÌ Ç¥Çö½ÄÀÌ µÈ´Ù. (result2 = (result = 1+2) +1 ÀÌ °¡´É)
±×¸®°í ¸¶Áö¸·¿¡ ½ÇÇàµÈ Ç¥Çö½ÄÀÇ °ªÀ» ¹ÝȯÇÑ´Ù. ¿¬»êÀÚ Ç¥Çö½Ä
a*b+c ´Â (a.*(b)).+(c)°ú °°´Ù.
±âº» ¿¬»êÀ» ÀçÁ¤ÀÇ ÇÒ ¼öµµ ÀÖ´Ù. Ä¿¸Çµå È®Àå
¹®ÀÚ¿À» ¿ªµû¿ÈÇ¥(backquotesȤÀº backtick)·Î ½Î°Å³ª %x ·Î ½ÃÀÛÇÏ´Â ±¸ºÐÀÚ Çü½ÄÀ» »ç¿ëÇϸé, À̰ÍÀº »ç¿ëÁßÀÎ ±â¹Ý ¿î¿µÃ¼Á¦¿¡ ÀÇÇØ Ä¿¸Çµå·Î ½ÇÇàµÈ´Ù.
Ä¿¸Çµå ¹®ÀÚ¿µµ Ç¥Çö½Ä È®Àå°ú ÀϹÝÀûÀÎ À̽ºÄÉÀÌÇÁ ¹®ÀÚ¿À» ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
Ä¿¸ÇµåÀÇ Á¾·á»óŰªÀº Àü¿ªº¯¼ö $?·Î È®ÀÎÇÒ ¼ö ÀÖ´Ù. ¿ªµû¿ÈÇ¥ ÀçÁ¤ÀÇÇϱâ
½ÇÁ¦·Î ¹®ÀÚ¿À» Kernel.`(¿ªµû¿ÈÇ¥ÇѰ³) ¸Þ¼µå¿¡ ¸Å°³º¯¼ö·Î ³Ñ±â´Â °ÍÀÌ´Ù.
¿øÇÑ´Ù¸é À̰͵µ ÀçÁ¤ÀÇ ÇÒ ¼öÀÖ´Ù. ´ëÀÔ¹®
·çºñ¿¡´Â µÎ°¡Áö ±âº»ÀûÀÎ ´ëÀÔ¹® Çü½ÄÀÌ ÀÖ´Ù.
1. º¯¼ö³ª »ó¼ö¿¡ °´Ã¼ ÂüÁ¶¸¦ ´ëÀÔÇÏ´Â°Í (¿¹ instrument ="piano")
2. ¿ÞÆí¿¡ °´Ã¼ÀÇ ¼Ó¼ºÀ̳ª ¿ä¼Ò°ª ÂüÁ¶¸¦ Æ÷ÇÔÇÏ´Â °æ¿ì (¿¹ song.duraiont = 234)
´ëÀÔ¹®¿¡¼ ¹Ýȯ°ªÀº ¹«½ÃµÈ´Ù. ÀԷ°ªÀÌ ±×´ë·Î ¹Ýȯ°ªÀÌ´Ù. º´·Ä ´ëÀÔ¹®
a,b = b,a
µ¿½Ã¿¡ ÀÌ·ç¾îÁü Áßø ´ëÀÔ¹®
b, (c,d), e = 1,2,3,4 -> b == 1, c== 2, d == nil, e == 3
b, (c,d), e = 1,2,3,4? -> 1,2,nil,3
b, (c,d),e = 1,2,3?,4 -> 1,2,3,4
b,(c,d,), e = 1,2,3,4?,5 -> 1,2,3,5
b,(c,*d),e = 1,2,3,4?,5 -> 1,2,3,4?,5
| ¿¬»êÀÚ | ÀÇ¹Ì | ||
| ==(ºÎÁ¤Çü !=) | µÎ °ªÀÌ °°ÀºÁö ºñ±³ | ||
| === | case ±¸¹®ÀÇ whenÇ׸ñÀÌ ºñ±³ÇÒ ´ë»ó°ú µ¿ÀÏÇÑÁö ºñ±³Çϴµ¥ ¾²ÀδÙ. | ||
| <=> | ÀϹÝÀûÀÎ ºñ±³ ¿¬»êÀÚ ¿ÞÂÊÀÌ ¿À¸¥ÂÊ º¸´Ù ÀÛÀ¸¸é -1, °°À¸¸é 0, Å©¸é 1 | ||
| =~(ºÎÁ¤Çü !~) | Á¤±ÔÇ¥Çö½Ä ÆÐÅÏÀÌ ¸ÅĪµÇ´ÂÁö °Ë»çÇÑ´Ù. | ||
| <. <=. >, >= | ÀÛ´Ù, À۰ųª °°´Ù, Å©´Ù, Å©°Å³ª °°´Ù | ||
| eql? | ¼ö½ÅÀÚ¿Í ¸Å°³º¯¼ö°¡ ¼·Î °°Àº ŸÀÔÀÌ¸ç °°Àº °ªÀ» °¡Áö´Â °æ¿ì ÂüÀÌ µÈ´Ù. (1 == 1.0Àº ÂüÀÌÁö¸¸, 1.eql?(1.0)Àº °ÅÁþÀÌ´Ù. | ||
| equal? | ¼ö½ÅÀÚ¿Í ¸Å°³º¯¼ö°¡ °°Àº °´Ã¼ ID¸¦ °¡Áú °æ¿ì ÂüÀÌ´Ù. | ||
word ||= default_value #word = word || default_value ºñ¾îÀÖÀ¸¸é default_value°¡ ºñ¾îÀÖÁö¾Ê´Ù¸é ¿ø·¡°ªÀÌ º¸Á¸µÈ´Ù.
if ~ then # thenÀº »ý·«¶Ç´Â :·Î ´ëü °¡´É #if ÀÇ ºÎÁ¤Çü unless Á¸Àç
elsif ~ then
else
end
? : #»ïÇ× ¿¬»êÀÚµµ Áö¿ø
begin/end ºí·ÏÀ» ±¸¹® º¯°æÀÚ·Î ²Ù¹Ð°æ¿ì, ³í¸® Ç¥Çö½ÄÀÇ °ª¿¡ »ó°ü¾øÀÌ ºí·ÏÀÇ Äڵ尡 ¹«Á¶°Ç ÇѹøÀº ½ÇÇàµÈ´Ù. (C¾ð¾îÀÇ do~ while ÄÚµå¿Í °°´Ù.)
loop do # break¸¦ ¸¸³¯¶§±îÁö ¹Ýº¹ÇÑ´Ù.
for song in songlist
caseÇ¥Çö½Ä
case
when ~ then(:À¸·Î ´ëü°¡´É)
else ~
end ¹Ýº¹¹®
¿ø½ÃÀûÀÎ ¹Ýº¹ ±¸¹®ÀÌ ÀÖ´Ù.
while #untilÀº whileÀÇ ºÎÁ¤Çü
~
end
¿¹)
file = File.Open("oridinal")
while file.gets
print if ~/third/ .. ~/fifth/ # °°Àº ¹æ¹ý puts(line) if line = ~ /third/ .. ~ /fifth/
end
#ÆÞÀÇ ÄÚµå¿Í À¯»çÇѵ¥ getsÀÇ ÀÐÀº ¸¶Áö¸·ÁÙÀº Àü¿ªº¯¼ö $_¿¡ µé¾î°¡°í ~¿¬»êÀÚ´Â Á¤±ÔÇ¥Çö½ÄÀÌ $_¿¡ ¸ÅĪÇÏ´ÂÁö¸¦ ÆÇ´ÜÇÑ´Ù. ¾Æ¹« ¸Å°³º¯¼ö ¾øÀÌ ¾´ print´Â $_ÀÇ ³»¿ëÀ» Ãâ·ÂÇÑ´Ù.
~
end
song.play
end
´Â
songlist.each do |song|
song.play
end
¿Í °°´Ù. for´Â »ç½Ç»ó ¹®¹ýÀ» Æí¸®ÇÏ°Ô ÇØÁÖ´Â ¹®¹ý»çÅÁ(syntactic sugar)¿¡ °¡±õ´Ù. ¹Ýº¹¹® Á¦¾î
break, next(C¾ð¾îÀÇ continue), redo (¹Ýº¹¹®½ÃÀÛºÎÅÍ ´Ù½Ã ¼öÇàÇ쵂 ´ÙÀ½ ¿ø¼Ò¸¦ °¡Á®¿À°Å³ª Á¾·áÁ¶°ÇÀ» ÀçÆò°¡ ÇÏÁö ¾Ê´Â´Ù.) retry (¹Ýº¹¹®À» ÃʱâÈ ½Ã۰í óÀ½ºÎÅÍ ´Ù½Ã ½ÃÀÛÇÑ´Ù.) º¯¼ö À¯È¿ ¹üÀ§
³»Àå ¹Ýº¹¹®ÀÎ while, until, for´Â »õ·Î¿î º¯¼ö ¹üÀ§¸¦ ¸¸µéÁö ¾Ê´Â´Ù.
Áï, ¹Ýº¹ÀÚ ³»¿¡ »õ·Î ¸¸µé¾îÁø Áö¿ª º¯¼ö´Â ¹Ýº¹¹®ÀÌ ³¡³ªµµ »ç¿ë°¡´ÉÇÏ´Ù.
ÇÏÁö¸¸ ¹Ýº¹ÀÚ¿¡¼ »ç¿ëÇÏ´Â ºí·Ï(loop, each µî)Àº Á¶±Ý ´Ù¸£´Ù.
ºí·Ï ¹Û¿¡¼ Á¢±ÙÇÒ ¼ö °¡ ¾ø´Ù. ÇÏÁö¸¸ ºí·Ï ¹Û¿¡¼ ¸ÕÀú °°Àº À̸§ÀÇ º¯¼ö°¡ ¼³Á¤µÇ¸é ±× º¯¼ö¸¦ ±×´ë·Î »ç¿ëÇÑ´Ù. 8Àå ¿¹¿Ü ó¸®
Exception Ŭ·¡½º
¿¹¿Ü¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áø °ÍÀº Exception Ŭ·¡½º ȤÀº ±× ÀÚ½Ä Å¬·¡½ºÀÇ °´Ã¼´Ù. ·çºñÀÇ ¿¹¿Ü Ŭ·¡½º »ó¼Ó °èº¸´Â Àß Á¤¸®µÇ¾î ÀÖ´Ù.
Á÷Á¢ ¿¹¿Ü Ŭ·¡½º¸¦ ÀçÁ¤ÀÇ ÇÑ´Ù¸é StandardError?¸¦ »ó¼ÓÇÏ´Â ÀÚ½Ä Å¬·¡½º·Î ¸¸µå´Â °ÍÀÌ ÁÁ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ±âº» ¿¹¿Ü ó¸® ·çƾ¿¡¼ ÀÌ ¿¹¿Ü¸¦ Àâ¾ÆÁÖÁö ¾ÊÀ» °ÍÀ̱⠶§¹®ÀÌ´Ù.
¸ðµç ¿¹¿Ü´Â ±× ¿¹¿Ü¿¡ ¿¬°üµÈ ¸Þ½ÃÁö, ±×¸®°í ½ºÅà ¿ªÃßÀû Á¤º¸¸¦ °¡Áö°í ÀÖ´Ù. ±×¸®°í Á÷Á¢ Á¤ÀÇÇÑ ¿¹¿Ü¶ó¸é Ãß°¡ Á¤¸¦ ´ãÀ» ¼öµµ ÀÖ´Ù.
| ·çºñ ¿¹¿Ü °èÃþ | |||
| Exception | |||
| fatal(·çºñ ³»ºÎ¿¡¼ »ç¿ë) | |||
| NoMemoryError? | |||
| ScriptError? | |||
| LoadError? | |||
| NotImplementedError? | |||
| SyntaxError? | |||
| SignalException? | |||
| Interrupt | |||
| StandardError? | |||
| ArgumentError? | |||
| IOError | |||
| EOFError | |||
| IndexError? | |||
| LocalJumpError? | |||
| NameError? | |||
| NoMethodError? | |||
| RangeError? | |||
| FloatDomainError? | |||
| RegexpError? | |||
| RuntimeError? | |||
| SecurityError? | |||
| SystemCallError? | |||
| ½Ã½ºÅÛ Á¾¼ÓÀûÀÎ ¿¹¿Üµé (Errno::xxx) | |||
| ThreadError? | |||
| TypeError? | |||
| ZeroDivisionError? | |||
| SystemExit? | |||
| SystemStackError? |
¿¹¿Ü ´Ù·ç±â
begin/end ºí·ÏÀ¸·Î °¨½Ñ µÚ, rescure ±¸¹®À» Çϳª ÀÌ»ó »ç¿ëÇØ¼ ¿ì¸®°¡ ó¸®ÇÒ ¿¹¿Ü¸¦ ¾Ë¸°´Ù.
begin
~ # begin ~ end ±¸¹® ¾È¿¡¼ rescue¸¦ ÅëÇÑ ¿¹¿Ü󸮸¦ ÇÒ¼ö Àִµ¥ ¿©±â¼ ãÁö ¸øÇÏ¸é ½ºÅÃÀ» °Å½½·Î ¿Ã¶ó°¡ È£ÃâÀÚ¿¡¼ ¿¹¿Ü¸¦ ã°ÔµÈ´Ù.
end
rescue SystemCallError # ÄÞ¸¶(,)·Î ±¸ºÐÇÏ¿© ¿©·¯ ¿¹¿Ü¸¦ µ¿½Ã¿¡ ó¸®ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à rescue ¸¶Áö¸·¿¡ "=> ¿¹¿Ü¹ÞÀ»º¯¼ö"¸¦ Ãß°¡ÇØÁÖ¸é ¿¹¿Ü °´Ã¼¸¦ ¹ÞÀ» Áö¿ª º¯¼ö¸¦ ¸¸µé¾îÁØ´Ù.
$stderr.print "IO failed: " + $! # ¿¹¿Ü°¡ ¹ß»ýÇϸé ÀÌÈÄÀÇ ¿¹¿Ü ó¸® °úÁ¤°ú º°µµ·Î, °ü·ÃµÈ Exception °´Ã¼ ÂüÁ¶¸¦ Àü¿ª º¯¼ö $!¿¡ ´ã´Â´Ù.
# ³ª¸ÓÁö ó¸®
raise # ¾Æ¹« ¸Å°³º¯¼ö ¾øÀÌ »ç¿ëÇÏ¸é ´Ù½Ã $!¿¡ ´ã±ä ¿¹¿Ü¸¦ ¹ß»ý½ÃÄÑ ´õ ³ôÀº °èÃþÀ¸·Î Àü´ÞÇÑ´Ù.
end
½Ã½ºÅÛ¿¡·¯
¿î¿µÃ¼Á¦°¡ ¿¡·¯ Äڵ带 ¹ÝȯÇßÀ» ¶§ ÀϾÙ. POSIX ½Ã½ºÅÛ¿¡¼´Â ÀÌ·¯ÇÑ ¿¡·¯°¡ EAGAIN, EPERM µîÀÇ À̸§À» °¡Áø´Ù. (À¯´Ð½º¿¡¼ man errno·Î ¿¡·¯ ¸ñ·ÏÀ» º¼ ¼ö ÀÖ´Ù.)
·çºñ¿¡¼´Â ÀÌ·± ¿¡·¯¸¦ ¿¹¿Ü °´Ã¼·Î °¨½Ñ´Ù. SystemCallError?ÀÇ ÇÏÀ§ Ŭ·¡½ºÀ̸ç, Errno¸ðµâ¿¡¼ Á¤ÀÇÇϰí ÀÖ´Ù.
Errno¿¹¿Ü °´Ã¼´Â ¿¡·¯ Äڵ带 Á÷Á¢¹ÝȯÇÏ´Â Errno¶ó´Â Ŭ·¡½º »ó¼ö¸¦ °¡Áø´Ù.
Errno::EAGAIN::Errno -> 35
Errno::EPERM::Errno -> 1
Errno::EIO::Errno -> 5
Errno::EWOULDBLOCK::Errno -> 35 # EAGAIN°ú ¿¡·¯ Äڵ尡 °°´Ù. SystemCallError?#===¸¦ ÀçÁ¤ÀÇ ÇÏ¿© °è½Âµµ »óÀÇ À§Ä¡°¡ ¾Æ´Ï¶ó ±× ¿¡·¯ ÄÚµå °ªÀ» Á÷Á¢ ºñ±³Çϵµ·Ï ¹Ù²Û °ÍÀÌ´Ù.
elseÀýµµ Àִµ¥ ¿¹¿Ü°¡ ¹ß»ýÇÏÁö ¾Ê¾Æ rescueºí·Ï¿¡ µé¾î°¡Áö ¾ÊÀ¸¸é ½ÇÇàµÈ´Ù. rescue¿Í ensureÀÇ »çÀÌ¿¡ À§Ä¡ÇÑ´Ù.
·çºñ¿¡¼ÀÇ include¹®Àº ´ÜÁö ÇØ´ç ¸ðµâ¿¡ ´ëÇÑ ÂüÁ¶¸¸ Ãß°¡½ÃŲ´Ù. ¸ðµâÀÌ ºÐ¸®µÈ ÆÄÀÏ·Î Á¸ÀçÇÑ´Ù¸é require½ÃÄÑ¾ß ÇÑ´Ù.
¿¹)
µÑ ´Ù Àý´ë°æ·Î, »ó´ë°æ·Î¸¦ °¡¸®Áö ¾Ê´Â´Ù.
<<¿¬»êÀÚ¸¦ ÀÌ¿ëÇØ¼ °´Ã¼¸¦ Ãß°¡ÇÏ´Â °Í°ú ¸¶Âù°¡Áö ¹æ¹ýÀ¸·Î Ãâ·Â¿ë IO ½ºÆ®¸²¿¡ °´Ã¼¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.
¹®ÀÚ¿¾øÀÌ ¸Þ¸ð¸®¿¡¼ IOÀ» ÇØ¾ßÇÒ ¶§ StringIO¸¦ »ç¿ëÇÑ´Ù. StringIOÇü °´Ã¼¿¡ ¹«¾ð°¡¸¦ ¾²¸é ÀÌ °ªÀº ¹®ÀÚ¿¿¡ ä¿öÁø´Ù.
Thread#new È£Ãâ°ú ÇÔ²² Á¦°øµÇ´Â ºí·ÏÀÌ ½º·¹µå¿¡¼ ½ÇÇàµÉ Äڵ尡 µÈ´Ù.
Thread#join Àº ƯÁ¤ ½º·¹µå°¡ ÀÏÀ» ³¡¸¶Ä¥¶§±îÁö ±â´Ù¸°´Ù.
Thread#value ´Â ½º·¹µå°¡ ¸¶Áö¸·¿¡ È£ÃâÇÑ ¹®ÀåÀÇ °ªÀ» ¹ÝȯÇÑ´Ù.
Thread#current ÇöÀç ½º·¹µå¿¡ Á¢±Ù
Thread#list Àüü ½º·¹µåÀÇ ¸ñ·Ï
Thread#status, Thread#alive? ´Â ƯÁ¤ ½º·¹µåÀÇ »óÅÂ
Thread#priority= ƯÁ¤ ½º·¹µåÀÇ ¿ì¼± ¼øÀ§¸¦ Á¶Á¤
¸»²ûÈ÷ Ä¡¿ì±â
ensureÀýÀº C++ ÀÇ finally ±¸¹®°ú °°´Ù. ¿¹¿Ü ó¸® ÈÄ Àç½Ãµµ
retry ±¸¹®À» »ç¿ëÇÏ¿© begin ~ end ±¸¹®À» Àç½Ãµµ ÇÒ ¼ö ÀÖ´Ù. ¹«ÇÑ·çÇÁ¿¡ ºüÁú ¼ö ÀÖÀ¸´Ï À¯ÀÇÇÒ °Í. ¿¹¿Ü ¹ß»ý½Ã۱â
Kernel.raise(°æ¿ì¿¡ µû¶ó Kernel.failÀ» ÀÌ¿ë)
raise # ´Ü¼øÈ÷ ÇöÀçÀÇ ¿¹¿Ü($!)¸¦ ´Ù½Ã ¹ß»ý½ÃŰ´Â °ÍÀÌ´Ù. (ÇöÀç ¿¹¿Ü°¡ ¾ø´Ù¸é ´Ü¼øÈ÷ RuntimeError¸¦ ¹ß»ý½ÃŲ´Ù.)
raise "bad mp3 encoding" # RuntimeError¸¦ ¹ß»ý½ÃŲ´Ù.
raise Interfaceexception, "Keyboard failure", caller # ù ¹øÂ° ¸Å°³º¯¼ö·Î ¿¹¿Ü Ŭ·¡½º¸¦ ¸¸µé°í(Exception °èÃþ Ŭ·¡½ºÀ̰ųª object.kind_of?(Exception)À» ÂüÀ¸·Î ¸¸Á·ÇÏ´Â °´Ã¼ÀÌ´Ù. exceptionÀ̶ó´Â ¸Þ½ÃÁö¿¡ ÀÀ´äÇÒ ¼ö ÀÖ´Â °´Ã¼¶ó¸é ¾î¶² °ÍÀ̵çÁö ¸Å°³º¯¼ö·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù´Â ¸»), µÎ¹øÂ° ¸Å°³º¯¼ö·Î °ü·Ã ¸Þ½ÃÁö ÀÛ¼ºÇϰí, ¼¼¹øÂ° ¸Å°³º¯¼ö·Î ½ºÅà ÃßÀûÇÑ´Ù.(ÀϹÝÀûÀ¸·Î Kernel.caller ¸Þ½ºµå¸¦ ÀÌ¿ëÇØ ¸¸µé¾îÁø´Ù.)
¿¹¿Ü¿¡ Á¤º¸ Ãß°¡Çϱâ
»õ·Î¿î ¿¹¿Ü¸¦ »ó¼Ó ¹Þ¾Æ Á¤ÀÇÇÔÀ¸·Î½á ¿¡·¯°¡ ³ ½ÃÁ¡¿¡¼ ¾Ë ¼ö ÀÖ´Â Á¤º¸ Áß Àü´ÞÇÒ Çʿ䰡 ÀÖ´Â °ÍÀ» Ãß°¡·Î ´ãÀ» ¼ö ÀÖ´Ù.
¿¹¸¦ µé¸é ¼ÒÄÏ Åë½ÅÁß¿¡ ¾î¶² ³×Æ®¿öÅ© ¿¡·¯´Â »óȲ¿¡µû¶ó ÀϽÃÀûÀ̶ó Àç½ÃµµÇÏ´Â°Ô Áß´ÜÇÏ´Â °Íº¸´Ù ³ªÀ» ¼ö ÀÖ´Ù. Catch¿Í Throw
catch´Â À̸§(ÈçÈ÷ SymbolÀ̳ª StringÀ» »ç¿ëÇÑ´Ù.)ÀÌ ºÙ¿©Áø ºí·ÏÀ» Á¤ÀÇÇÑ´Ù.
throw¸¦ ¸¸³ª¸é ·çºñ´Â ÇØ´çÇÏ´Â ½É¹úÀ» °¡Áø catch¸¦ ã¾Æ Äڵ带 °Å½½·Î ¿Ã¶ó°£´Ù. ±×¸®°í ã°ÔµÇ¸é, ·çºñ´Â ½ºÅÃÀ» ÇØ´çÀ§Ä¡·Î µÇµ¹¸° µÚ ºí·ÏÀ» Á¾·áÇÑ´Ù.
catch (:done) do # catch ºí·Ï ³»ºÎ¿¡ throw°¡ »ç¿ëµÉ °æ¿ì ÇØ´ç catch ºí·ÏÀÇ ³ª¸ÓÁö ÄÚµå´Â »ý·«ÇÏ°í ºí·ÏÀ» ºüÁ®³ª¿Â´Ù.
...
throw :done unless fields = line.split(/\t/)
...
end
def ~
...
throw :quit_requested if res == "!" #throw°¡ catchºí·Ï¿¡ ¼ÓÇÏÁö ¾ÊÀ»¶§, ÇØ´ç ºí·ÏÀÇ catchºí·ÏÀ» ½ÇÇàÇÏ¿© °á°ú°ªÀ¸·Î ¹ÝȯµÈ´Ù.
...
end
catch :quit_requested do
...
end
9Àå ¸ðµâ
¸ðµâÀº ¸Þ¼µå, Ŭ·¡½º, »ó¼ö¸¦ Çϳª·Î ¹´Â ¼ö´ÜÀÌ´Ù.
1. ¸ðµâÀº À̸§°ø°£(Namespaces)À» Á¦°øÇؼ À̸§ÀÌ Ãæµ¹ÇÏ´Â °ÍÀ» ¸·¾ÆÁØ´Ù.
2. ¸ðµâÀº ¹Í½ºÀÎ(mixin)±â´ÉÀ» ±¸ÇöÇϴµ¥ »ç¿ëÇÑ´Ù.
module ´ë¹®ÀڷνÃÀÛ # Ŭ·¡½º¿Í À¯»ç
»ó¼ö´Â´ë¹®ÀڷνÃÀÛ
def ¸ðµâ¸í.¸Þ¼µå¸íÀº¼Ò¹®ÀڷνÃÀÛ
...
end
...
end
#Á¢±ÙÇÒ¶§´Â
require '¸ðµâÀ̸§'
¸ðµâÀ̸§.¸Þ¼µåÀ̸§() # ¸ðµâÇÔ¼öÈ£Ãâ
¸ðµâÀ̸§::»ó¼öÀ̸§ # ¸ðµâ»ó¼öÁ¢±Ù
¹Í½ºÀÎ
Ŭ·¡½º ¼±¾ð¿¡ ¸ðµâÀ» Æ÷ÇÔ(include)ÇÒ ¼ö ÀÖ´Ù.
¹Í½ºÀÎµÈ ¸ðµâÀº ½ÇÁ¦·Î´Â ÀÏÁ¾ÀÇ »óÀ§ Ŭ·¡½ºÃ³·³ µ¿ÀÛÇÑ´Ù.
·çºñ¿¡¼ Comparable ¹Í½ºÀÎÀ» Æ÷ÇÔÇϸé Ŭ·¡½º ºñ±³ ¿¬»êÀÚ(<, <=, ==, >=, >)¿Í between? ¸Þ¼µå°¡ Ãß°¡µÈ´Ù. À̰ÍÀ» °¡´ÉÇÏ°Ô Çϱâ À§Çؼ Ŭ·¡½º°¡ <=> ¿¬»êÀÚ¸¦ Á¤ÀÇÇϰí ÀÖ´Ù°í °¡Á¤ÇÑ´Ù.
±×·¯¹Ç·Î Ŭ·¡½º¸¦ ¸¸µé¶§´Â <=>¸Þ¼µå¸¦ Á¤ÀÇÇϰí, ComparableÀ» Æ÷ÇÔÇÏ´Â ÀÛÀº ¼ö°í·Î ¿©¼¸°³ÀÇ ºñ±³ÇÔ¼ö¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¹Ýº¹ÀÚ¿Í Enumerable ¸ðµâ
ÁýÇÕÀÇ °¢ ¿ø¼Ò¸¦ Â÷·Ê·Î ¹ÝȯÇÏ´Â each¶ó´Â ¹Ýº¹ÀÚ¸¦ ÀÛ¼ºÇϰí Enumerable ¸ðµâÀ» ¹Í½ºÀÎÇϸé, map, include?, find_all °°Àº ¸Þ¼µå¸¦ Áö¿øÇÏ°Ô µÈ´Ù.±×¸®°í ±× ÁýÇÕÀÇ ¿ø¼ÒµéÀÌ <=> ¸Þ¼µå¸¦ °¡Áö°í ÀÇ¹Ì ÀÖ´Â ¼ø¼¸¦ Á¤ÇÑ´Ù¸é min, max, sort¿Í °°Àº ¸Þ¼µåµµ ¾ò°Ô µÈ´Ù. ¹Í½ºÀÎÀÇ ÀνºÅϽº º¯¼ö
¹Í½ºÀÎ ³»ºÎ¿¡ ÀνºÅϽº º¯¼ö¸¦ »ç¿ëÇÏ·Á¸é ±¸º°µÇ´Â À¯ÀÏÇÑ À̸§À» °¡Áö°Ô ÇØ¾ß ÇÑ´Ù.
(¸ðµâÀÇ À̸§À» º¯¼ö À̸§¿¡ ÇÕÄ¡¸é ÆíÇÒ °ÍÀÌ´Ù. ´ë¾ÈÀ¸·Î ¸ðµâÀÌ ·çºñ ÀνºÅϽºº¯¼ö¸¦ Á÷Á¢¾²Áö ¾Ê°í ÇöÀçÀÇ °´Ã¼ ID·Î »öÀÎÇÏ¿© ÀνºÅϽº º°·Î µ¥ÀÌÅ͸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â ¸ðµâ ¼öÁØÀÇ ÇØ½Ã¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.) ¸Þ¼µå À̸§¿¡¼ ¸ðÈ£ÇÔ ÇØ¼ÒÇϱâ
°°Àº À̸§À» Á¸ÀçÇÒ ¼öµµ ÀÖÀ» ¶§ °Ë»ç ¼ø¼´Â ´ÙÀ½°ú °°´Ù.
1.°´Ã¼ÀÇ Å¬·¡½º ÀÚü¸¦ ã´Â´Ù.
2.Ŭ·¡½º¿¡ Æ÷ÇÔµÈ ¹Í½ºÀÎÀ» ã´Â´Ù.
3.»óÀ§Å¬·¡½º¿Í »óÀ§Å¬·¡½º¹Í½ºÀÎÀ» ã´À´Ù.
*¿©·¯°³ÀÇ ¸ðµâÀÌ ¼¯¿©ÀÖ´Ù¸é, ¸¶Áö¸·¿¡ Æ÷ÇÔµÈ °ÍºÎÅÍ Ã£´Â´Ù. ´Ù¸¥ ÆÄÀÏ Æ÷ÇÔÇϱâ
load "·çºñÆÄÀÏ(*.rb)" # ½ÇÇàµÉ ¶§¸¶´Ù ¹«Á¶°Ç ÇØ´çÀ̸§À» °¡Áø ·çºñ ¼Ò½º Äڵ带 ·ÎµåÇÑ´Ù.
require "·çºñÆÄÀÏ" # Á» ´õ ÀÚÁÖ »ç¿ëµÇ´Â require´Â ÇØ´ç ÆÄÀÏÀ» ´Ü ÇÑ ¹ø¸¸ ·ÎµåÇÑ´Ù. ÀоîµéÀÎ ÆÄÀÏ ¸ñ·ÏÀ» ¹è¿ $"¿¡ º¸°üÇÑ´Ù. ±×¸®°í require¹® ÀÚüµµ ½ÇÇà °¡´ÉÇÑ ±¸¹®ÀÌ´Ù. (Ãß°¡ ±â´ÉÀ¸·Î °øÀ¯µÈ ¹ÙÀ̳ʸ® ¶óÀ̺귯¸® (À©µµ¿ì *.dll ¸®´ª½º *.so)¸¦ ·ÎµåÇÒ ¼ö ÀÖ´Ù.)
»ó´ë°æ·Î¸¦ ¾´´Ù¸é ·Îµå°æ·Î($:)¿¡ ÀÖ´Â ¸ðµç µð·ºÅ丮¸¦ °Ë»öÇÑ´Ù. 10Àå ±âº» ÀÔÃâ·Â
Kernel ¸ðµâ¿¡´Â ÀÔÃâ·Â °ü·ÃµÈ ¸Þ¼µå°¡ ÀüºÎ ±¸ÇöµÇ¾î ÀÖ´Ù.
gets, open, print, printf, putc, puts, readline, readlines, testµîÀ¸·Î ÀÌ ¸Þ¼µåµéÀº Ç¥ÁØ ÀÔÃâ·ÂÀ» Áö¿øÇÑ´Ù.
Á» ´õ ´Ù¾çÇÑ Á¦¾î°¡ ÇÊ¿äÇÏ´Ù¸é IO °´Ã¼¸¦ »ç¿ëÇÏ¸é µÈ´Ù. IO °´Ã¼
ÀÔÃâ·ÂÀ» ´ã´çÇÏ´Â ±âº» Ŭ·¡½º IO¸¦ Á¦°øÇÑ´Ù. ÀÌ Å¬·¡½º¸¦ »ó¼ÓÇÑ FileŬ·¡½º³ª BasicSocket? Ŭ·¡½º¿¡¼µµ ±âº» ¿øÄ¢Àº µ¿ÀÏÇÏ´Ù. ÆÄÀÏ ¿°í ´Ý±â
File.new("ÆÄÀϸí","r") # r, w, rw
¸¦ »ç¿ëÇØ ÆÄÀÏÀ» ¿¼ö ÀÕÁö¸¸ ±×°Í º¸´Ù´Â File.openÀ» »ç¿ëÇϴ°ÍÀÌ ´õ ³´´Ù. º¸ÅëÀÇ °æ¿ì °°Àº ¿ªÈ°À» ÇÏÁö¸¸ ºí·ÏÀÌ °áÇÕµÇ¸é ¸Å°³º¯¼ö·Î »õ·Î ¿¸° °´Ã¼¸¦ ³Ñ°ÜÁÖ°í ºí·ÏÀÌ Á¾·áµÇ¸é ÀÚµ¿À¸·Î closeµÈ´Ù. Àбâ À§ÇÑ ¹Ýº¹ÀÚ
IO#each_byte { |ch| putc ch; print "." } # °¢ ¹ÙÀÌÆ®¸¦ ÀÐ¾î¼ È¸é¿¡ Á¡(.)°ú ÇÔ²² Ãâ·ÂÇÑ´Ù.
IO#each_line { |line| puts "Got #{line.dump}" } # ÇÑ ÁÙÀ» ÀÐ¾î¼ ºí·ÏÀ» È£ÃâÇÑ´Ù. ±âº»ÀûÀ¸·Î \nÀ» ±¸ºÐÀÚ·Î »ç¿ëÇÏÁö¸¸ each_lineÇÔ¼ö¿¡ ¸Å°³º¯¼ö·Î ±¸ºÐÀÚ¸¦ ³Ñ°ÜÁÙ ¼ö ÀÖ´Ù.
IO#foreach # IO´ë»óÀ» ¸Å°³º¯¼ö·Î ¹Þ¾Æ¼ Àбâ¿ëÀ¸·Î ¿°í, °¢ ÁÙº°·Î ºí·ÏÀ» È£ÃâÇÑ ´ÙÀ½ ÀÚµ¿À¸·Î ÆÄÀÏÀ» ´Ý´Â´Ù.
IO#read # ´ë»óÀÇ Àüü¸¦ ¹®ÀÚ¿ ÇüÅ·ΠÀд´Ù.
IO#readlines # ´ë»óÀÇ Àüü¸¦ ¹®ÀÚ¿ ¹è¿·Î Àд´Ù. ÆÄÀÏ¿¡ ¾²±â
ÀÌÁø µ¥ÀÌÅ͸¦ ÀÚ½ÅÀÇ ¿ø·¡ ÇüÅ·Π¹®ÀÚ¿¿¡ ÀúÀåÇϰíÀÚ ÇÑ´Ù¸é
¸®ÅÍ·²À» »ç¿ëÇÏ´Â °Í, ¹ÙÀÌÆ® º°·Î °¢°¢ ³Ö¾îÁÖ´Â °Í, Array#packÀ» »ç¿ëÇÏ´Â °Í 3°¡Áö ¹æ¹ý ³×Æ®¿öÅ©
require 'socket' # ¼ÒÄÏ »ç¿ë °¡´É
...
client = TCPSocket.open('127.0.0.1', 'finger')
client.send("mysql\n", 0) # 0Àº Ç¥ÁØ ÆÐŶÀ» ÀǹÌ
puts client.readlines
client.close
require 'net/http' # lib/netÀÇ ¶óÀ̺귯¸®µéÀÌ ¿©·¯ ¾ÖÇø®ÄÉÀÌ¼Ç ·¹º§ÀÇ ÇÁ·ÎÅäÄÝ(HTTP, FTP, POP, SMTP, telnet µîÀ» Áö¿ø)
h=Net::HTTP.new('www.red.com',80)
response = h.get('/index.html',nil)
if response.message == "OK"
puts response.body.scan(/<img src="(.*?)"/m).uniq
end
require 'open-uri' # open-uri¶óÀÔ »ç¿ë
open('http://www.red.com') do |f| #Kernel.open ¸Þ¼µå°¡ http:// ftp://¸¦ ÆÄÀÏ À̸§Ã³·³ ÀνÄÇÑ´Ù.
puts f.read.scan(/<img src="(.*?)"/m).uniq
end
11Àå ½º·¹µå¿Í ÇÁ·Î¼¼½º
·çºñ ½º·¹µå´Â ·çºñ ÀÎÅÍÇÁ¸®ÅÍ ¾È¿¡¼ ±¸ÇöµÇ¾úÀ¸¸ç ¿ÏÀüÇÏ°Ô ÀÌ ÇÁ·Î¼¼½º ¾È¿¡¼ ±¸µ¿µÈ´Ù.
µû¶ó¼ ·çºñÀÇ ½º·¹µå À̽ļºÀ¸ ¿Ïº®ÇÏ°Ô º¸ÀåµÈ´Ù. ¿î¿µÃ¼Á¦¿¡ ÀÇÁ¸ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ÇÏÁö¸¸ µ¿½Ã¿¡ ³×ÀÌÆ¼ºê ½º·¹µåÀÇ ÀÌÁ¡À» ³õÄ¡°Ô µÇ¾î ½º·¹µå ±â¾Æ Çö»ó¿¡ ºüÁú À§ÇèÀÌ ³ôÀ¸¸ç µ¥µå¶ô¿¡ ºüÁö°Ô µÈ´Ù¸é ÇÁ·Î¼¼½º Àüü°¡ ÁߴܵǴ ºÒ»ó»ç°¡ »ý±æ ¼öµµ ÀÖ´Ù. ½º·¹µå Áö¿ª º¯¼ö¿¡ Á¢±Ù
½º·¹µå °´Ã¼°¡ ÀÏÁ¾ÀÇ ÇØ½ÃÀΰÍó·³ Á¢±ÙÇÏ¿© Áö¿ªº¯¼ö ¸íÀ¸·Î Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
Thread.currentmycount? = count # ÇöÀç ½º·¹µå¿¡ ¼ÓÇÑ Áö¿ªº¯¼ö mycount¿¡ countº¯¼ö¸¦ ´ëÀÔÇÑ´Ù.
| abort_on_exception or µð¹ö±× Ç÷¡±× | ¼³¸í |
| false | default·Î ÇöÀç ½º·¹µå¸¸ Á¾·á ½ÃŲ´Ù. |
| true | 󸮵ÇÁö ¾ÊÀº ¿¹¿Ü°¡ ½ÇÇàÁßÀÎ ¸ðµç ½º·¹µå¸¦ Á¾·á½ÃŲ´Ù. |
puts´Â º¸ÀÌÁö ¾Ê°Ô ¸Å°³º¯¼ö Ãâ·Â°ú °³Ç๮ÀÚÇϳª¸¦ Ãâ·ÂÇÑ´Ù. ½º·¹µå ¾ÈÁ¤¼ºÀÌ ¾ø´Ù.
Thread#run, stop, pass ½º·¹µåÀÇ ½ÇÇà, Á¤Áö, ´Ù¸¥ ½º·¹µå°¡ ½ÇÇàµÇµµ·Ï ÇöÀçÀÇ Á¦¾î±ÇÀ» ±×³É ³Ñ±è
´ë½Å Monitor ¶óÀ̺귯¸®, Sync ¶óÀ̺귯¸®, Mutex_m ¶óÀ̺귯¸®¸¦ »ç¿ëÇÑ´Ù.
½ÇÇàÁß¿¡ »ó¼Ó ¹Þ´Â ¹æ¹ý
µ¿±âÈ °´Ã¼¸¦ »ý¼ºÇØ µ¿±âÈ ½ÃŲ´Ù.
½Ã½ºÅÛÀÇ Ç¥ÁØÃâ·ÂÀ» °¡·Îä±â À§Çؼ´Â `(¿ªµû¿ÈÇ¥) ¹®ÀÚ·Î °¨½Î¼ ¹Ýȯ°ªÀ» ¾òÀ» ¼ö ÀÖ´Ù.
ÈξÀ º¹ÀâÇÏ°Ô ÇÏÀ§ ÇÁ·Î¼¼½º¿Í Åë½ÅÀ» ÇØ¾ß ÇÒ °æ¿ì IO.popenÀ» »ç¿ëÇÑ´Ù.
IO.popenÀÇ ¸Å°³º¯¼ö¿¡ "-" (ÇϳªÀÇ ¸¶À̳ʽº ±âÈ£)¸¸ ³Ñ°ÜÁÖ¸é Æ÷Å©(fork)ÇÑ´Ù. (À©µµ¿ì¿¡¼´Â ½ÇÇàµÇÁö ¾Ê´Â´Ù.)
ÀϺΠÇ÷§Æû¿¡¼´Â open ¸Þ¼µå ¿Ü¿¡µµ Kernel.fork, Kernel.exec, IO.pipe ¸Þ¼µå¸¦ Á¦°øÇÑ´Ù.
ÀÚ½Ä ÇÁ·Î¼¼½ºÀÇ Á×À½¿¡ ÇØ´çÇÏ´Â ½Ã±×³ÎÀÎ SIGCLD¿¡ ´ëÇÑ Æ®·¦ ¼³Á¤ÀÌ´Ù.
´õ ÀÚ¼¼ÇÑ ³»¿ëÀº Kernel.open, IO.open, Process ¸ðµâºÎºÐÀ» ã¾Æº¸±æ ¹Ù¶÷
´Ü¾ð¹®(assertion)
ÀоîºÃ°í ÀÏ´Ü »ý·«
11. »ç¿ëÁßÀÎ °´Ã¼ÀÇ Å¬·¡½º´Â °³¹ßÀÚ°¡ »ý°¢ÇÏ´Â °Í°ú µ¿ÀÏÇØ¾ß ÇÑ´Ù. Àǽɽº·´´Ù¸é my_obj.classÈ£Ãâ·Î È®ÀÎ °¡´ÉÇÏ´Ù.
µ¿±âÈ
Thread.critical = true ´Ù¸¥½º·¹µå¸¦ ½ºÄÉÁÙÇÏÁö ¾Ê¾Æ ½ÇÇàÀ» ¸·´Â´Ù. ÇÏÁö¸¸ »õ·Î¿î ½º·¹µå°¡ »ý¼ºµÇ¾î ½ÇÇàµÇ´Â °ÍÀº ¸·Áö ¾Ê´Â´Ù.
¾Ê¾²´Â°Ô ÁÁ´Ü´Ù-_- À§ÇèÇÏ´Ü´Ù.. ¸ð´ÏÅÍ
MonitorÀ» »ó¼ÓÇϰųª ¹Í½ºÀÎÇÑ´Ù.
class Counter < Monitor
or
include MonitorMixin
...
synchronize do
...
end
À» »ç¿ëÇØ¼ µ¿±âÈ ½ÃŲ´Ù.
c = Counter.new
c.extend(MonitorMixin)
lock = Monitor.new
lock.synchronize { ... }
´ÙÁß ÇÁ·Î¼¼½º ½ÇÇà
Kernel.system ÁÖ¾îÁø ¸í·ÉÀ» ÇÏÀ§ ÇÁ·Î¼¼½º¿¡¼ ½ÇÇàÇÑ´Ù. ¼º°øÇϸé true, ¾Æ´Ï¸é false
IO.popenÀº ÇÏÀ§ ÇÁ·Î¼¼½º·Î ¸í·ÉÀ» ½ÇÇàÇϰí Ç¥ÁØ ÀԷ°ú Ç¥ÁØ Ãâ·ÂÀ» ·çºñÀÇ IO °´Ã¼¿Í ¿¬°á½ÃŲ´Ù.
ÀÔ·ÂÀÇ °æ¿ì puts°ú °°Àº Ç¥ÁØ Ãâ·Â ¸Þ¼µåÀ» »ç¿ëÇϰí flushÀÇ ¿ëµµ·Î IO#close_write¸Þ¼µå¸¦ »ç¿ëÇÑ´Ù.
Ãâ·ÂÀÇ °æ¿ì Ç¥ÁØ ÀÔ·Â ¸Þ¼µå¸¦ »ç¿ëÇÔÀ¸·Î½á ¾òÀ» ¼ö ÀÖ´Ù.
¿ø·¡ ÇÁ·Î¼¼½º´Â IO °´Ã¼¸¦ ¾òÀ» ¼ö ÀÖ°í, ÀÚ½Ä ÇÁ·Î¼¼½º´Â nilÀ» ¹Þ´Â´Ù.
¶ÇÇÑ ¸¹Àº IO ¸Þ¼µå¿Í Kernel.openÀÇ ÆÄÀÏ¸í °ü½À»ó ÆÄÀϸíÀÇ Ã¹¹øÂ° ¹®ÀÚ°¡ |¶ó¸é ÇÏÀ§ ÇÁ·Î¼¼½º¸¦ »ý¼ºÇÑ´Ù. (File.new´Â ¿¹¿Ü·Î ÀÏ¹Ý ÆÄÀÏ¿¡ ´ëÇØ¼¸¸ ÀÛµ¿ÇÏ°í ÆÄÀÌÇÁ¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù.) µ¶¸³Àû ÀÚ¼Õ
exec("sort testfile > output.txt") if fork.nil?
Process.wait
ÀÚ½Ä ÇÁ·Î¼¼½º´Â sort¸¦ ÁøÇàÇÏ°í ºÎ¸ð ÇÁ·Î¼¼½º´Â ±×³É °è¼Ó ÁøÇàÇÑ´Ù.
trap("CLD") do
pid = Process.wait
puts "Child pid #{pid}: terminated"
end
exec("sort testfile > output.txt") if fork.nil?
IO.popen("date") {|f| puts "Date is #{f.gets}" }
File#openÀÌ ±×·¯Çϵí ÄÚµå ºí·ÏÀÌ Á¾·áµÉ ¶§ ÀÚµ¿À¸·Î ´ÝÈù´Ù.
fork do
puts "in child, pid = #$$"
exit 99
end
pid = Process.wait
puts "Child terminated, pid = #{pid}, status = #{$?.exitstatus}" #$?´Â ÇÏÀ§ ÇÁ·Î¼¼½ºÀÇ Á¾·á¿¡ ´ëÇÑ Á¤º¸¸¦ °¡Áø Àü¿ª º¯¼ö´Ù.
Kernel#fork¿Í ºí·ÏÀ» °áÇÕÇÏ¸é ºí·Ï¾ÈÀÇ ÄÚµå´Â ·çºñ ÇÏÀ§ ÇÁ·Î¼¼½º¿¡¼ ½ÇÇàµÇ°í, ºÎ¸ð ÇÁ·Î¼¼½º´Â ºí·Ï ÀÌÈĸ¦ ¼öÇàÇÑ´Ù. 12Àå ´ÜÀ§ Å×½ºÆ®
Test::Unit ÇÁ·¹ÀÓ¿öÅ©ÀÇ ¼¼°¡Áö ±â´É
1.°³º° Å×½ºÆ®¸¦ Ç¥ÇöÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù.
2.Å×½ºÆ®¸¦ ±¸Á¶ÈÇÏ´Â ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¦°øÇÑ´Ù.
3.Å×½ºÆ®¸¦ ¼öÇàÇϱâ À§ÇÑ À¯¿¬ÇÑ ¹æ¹ýÀ» Á¦°øÇÑ´Ù. 13Àå ¹®Á¦°¡ ¹ß»ýÇßÀ» ¶§
·çºñ µð¹ö°Å
ruby -r debug µð¹ö±×¿É¼Ç ÇÁ·Î±×·¥ÆÄÀÏ ÇÁ·Î±×·¥¸Å°³º¯¼ö ´ëÈÇü ·çºñ ¼Ð
irb irb¿É¼Ç ·çºñ½ºÅ©¸³Æ® ÇÁ·Î±×·¥¸Å°³º¯¼ö µ¿ÀÛÇÏÁö ¾Ê´Â´Ù!
1. ¹«¾ùº¸´Ù ¸í½ÉÇÒ Á¡Àº ¸ÕÀú °æ°í°¡ Ãâ·ÂµÇµµ·Ï ÇÏ¸é¼ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. (-w ¸í·ÉÇà ¿É¼ÇÀ» »ç¿ëÇÑ´Ù.)
2. ¸Å°³º¯¼ö ¸ñ·Ï(ƯÈ÷ Ãâ·Â¿ë)¾È¿¡¼ ','À» ¾²´Â °ÍÀ» Àؾî¹ö·È´Ù¸é ¸Å¿ì ÀÌ»óÇÑ ¿¡·¯ ¸Þ½ÃÁö°¡ ³ª¿Ã ¼ö ÀÖ´Ù.
3. ¼Ò½ºÄÚµåÀÇ ¸¶Áö¸· ÁÙ¿¡¼ ÇØ¼® ¿¡·¯(parse error)°¡ ³ªÅ¸³ª´Â °ÍÀº ´ëºÎºÐ end Ű¿öµå¸¦ À߸ø »ç¿ëÇÑ °æ¿ì´Ù.
4. ¼Ó¼º ¼³Á¤ ¸Þ¼µå°¡ È£ÃâµÇÁö ¾Ê´Â´Ù. Ŭ·¡½º Á¤ÀÇ ³»¿¡¼ ·çºñ´Â setter=¸¦ ¸Þ¼µå È£ÃâÀÌ ¾Æ´Ñ Áö¿ª º¯¼ö¿¡ ´ëÇÑ ´ëÀÔÀ¸·Î ÇØ¼®ÇÑ´Ù.
class Incorrect
{
attr_accessor :one :two
def initialize
one = 1 # Áö¿ª º¯¼öÀÌ´Ù.
self.two = 2
end
}
5. ÀûÀýÈ÷ ÃʱâÈ µÇÁö ¾Ê´Â °Íó·³ º¸ÀÌ´Â °´Ã¼´Â initialize¸Þ¼µå À̸§À» À߸ø ¾´ °ÍÀ̰ųª ÀνºÅϽº º¯¼ö À̸§À» À߸ø ¾´ °æ¿ìÀÏ ¼öµµ ÀÖ´Ù.
6. ºí·Ï Çü½Ä Àμö´Â Áö¿ª º¯¼ö¿Í µ¿ÀÏÇÑ ¹üÀ§¸¦ °®´Â´Ù. ±âÁ¸ÀÇ Áö¿ª º¯¼ö¿Í °°Àº À̸§À» °®´Â ºí·Ï Çü½ÄÀμö°¡ ºí·ÏÀ» ½ÇÇàÇÒ ¶§ Á¸ÀçÇÑ´Ù¸é, Áö¿ªº¯¼ö´Â ºí·Ï È£Ãâ¿¡ ÀÇÇØ¼ °ªÀÌ º¯°æµÈ´Ù. À̸§À» Áߺ¹ÇÏÁö ¾Êµµ·Ï ÇÑ´Ù.
7. ¿ì¼±¼øÀ§´Â do~endº¸´Ù {}ÀÌ ³ô´Ù.
def one(arg) ~ end
def two ~ end
result1 = one two { ~ } # two¿¡¼ ºí·ÏÀÌ È£ÃâµÈ´Ù.
result2 = one two do ~ end # one¿¡¼ ºí·ÏÀÌ È£ÃâµÈ´Ù.
8. Å͹̳ο¡ ´ëÇÑ Ãâ·ÂÀº ¹öÆÛ¸µµÈ´Ù. ¹öÆÛ¸µÇÏÁö ¾Ê´Â I/O (sync = true ¿É¼Ç)À» »ç¿ëÇÏ¸é µÈ´Ù.
9. ¼ýÀÚ°¡ ¿Ã¹Ù¸£Áö ¾Ê´Ù¸é ¹®ÀÚ¿ ŸÀÔÀÏ °ÍÀÌ´Ù. Integer()È£Ãâ·Î ¼ýÀÚ Çü½ÄÀ¸·Î ¹Ù²Ù¾îÁÙ Çʿ䰡 ÀÖ´Ù.
num1, num2 = line.split(/,/) # num1,num2´Â ¹®ÀÚ¿ Çü½ÄÀÌ´Ù.
num1 = Integer(num1)
num2 = Integer(num2)
# or
num1, num2 = line.split(/,/).map { |val| Integer(val) }
10. ÀǵµÇÏÁö ¾ÊÀº º°Äª - ¾î¶² °´Ã¼¸¦ ÇØ½Ã¿¡ ´ëÇÑ Å°·Î »ç¿ëÇÑ´Ù¸é, ±× °´Ã¼°¡ ÀÚ½ÅÀÇ ÇØ½Ã°ªÀ» º¯°æÇÏÁö ¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù. º¯°æµÈ´Ù¸é Hash#rehashÈ£ÃâÇØ ´Ù½Ã ÇØ½Ã¸¦ ±¸¼ºÇØ¾ß ÇÑ´Ù.
12. ¸Þ¼µå À̸§Àº Ç×»ó ¼Ò¹®ÀÚ·Î ½ÃÀÛÇϰí, Ŭ·¡½º¿Í »ó¼ö À̸§Àº Ç×»ó ´ë¹®ÀÚ·Î ½ÃÀÛÇÑ´Ù.
13. ¸Þ¼µå È£ÃâÀÌ ±â´ë¿Í °°ÀÌ µ¿ÀÛÇÏÁö ¾ÊÀ¸¸é ¸Å°³º¯¼ö¸¦ °ýÈ£·Î ¹¾î º¸ÀÚ.
14. ¸Þ¼µå Çü½Ä Àμö ¸ñ·ÏÀ» ¿©´Â °ýÈ£°¡ ¸Þ¼µå À̸§ µÚ¿¡ °ø¹é ¾øÀÌ ºÙ¾î ÀÖ´ÂÁö È®ÀÎÇØ¾ßÇÑ´Ù.
15. irb¿Í µð¹ö°Å¸¦ »ç¿ëÇÑ´Ù.
16. Object#freeze¸¦ ÀÌ¿ëÇÏ¿© ÄÚµåÁß ¾Ë ¼ö ¾ø´Â ºÎºÐ¿¡¼ º¯¼ö¸¦ ¾û¶×ÇÏ°Ô ¹Ù²î´ÂÁö È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
17. ¾ÖÇø®ÄÉÀ̼ÇÀº Á¡ÁøÀûÀ¸·Î °³¹ßÇ϶ó.
18. Test::UnitÀ» ÀÌ¿ëÇØ TDD¸¦ Ç϶ó. º¥Ä¡¸¶Å©
Benchmark ¸ðµâ
ÁÖÀÇ ÇØ¾ß ÇÒ Á¡Àº °¡ºñÁö Ä÷ºÅͰ¡ º¥Ä¡¸¶Å©Áß ÀÏ¾î³´Ù¸é ¼º´ÉÀ» À߸ø ÃøÁ¤ÇÒ ¼ö Àִµ¥ Å×½ºÆ®¸¦ µÎ¹ø ¼öÇàÇÏ´Â bmbm¸Þ¼µå°¡ Á¸ÀçÇÑ´Ù. µÎ¹ø ¼öÇàÇÔÀ¸·Î »ó´ëÀûÀ¸·Î °¡ºñÁö Ä÷ºÅÍ¿¡ ÀÇÇÑ ¿Ö°îÀ» ÁÙÀÏ ¼ö ÀÖ´Ù. ÇÁ·ÎÆÄÀÏ·¯
·çºñ¿¡¼ Á¦°øÇÏ´Â ÇÁ·ÎÆÄÀÏ·¯¸¦ »ç¿ëÇÏ·Á¸é
¸í·ÉÇà ¿É¼Ç -r profile
ÄÚµå ³»ºÎ require 'profile' 2ºÎ ·çºñ ¼¼ÆÃÇϱâ
14Àå ·çºñ¿Í ¼¼»ó
15Àå ´ëÈÇü ·çºñ ¼Ð
16Àå ·çºñ ¹®¼È
17Àå ·çºñÁªÀ» ÀÌ¿ëÇÑ ÆÐŰÁö °ü¸®
18Àå ·çºñ¿Í À¥
CGI ½ºÅ©¸³Æ® ÀÛ¼ºÇϱâ
ÃʱâÀÇ À¥ÇÁ·Î±×·¡¹ÖÀº ¸ðµÎ CGI ÇÁ·Î±×·¥À¸·Î ÀÛ¼ºµÇ¾ú´Ù. CGI´Â º°µµ·Î ½ÇÇà°¡´ÉÇÑ ¸í·ÉÇà ÇÁ·Î±×·¥ÀÇ ÇüÅ·ΠÀÛ¼ºµÇ¸ç, À¥¼¹ö¿Í Ç¥ÁØ ÀÔÃâ·Â ¶Ç´Â ȯ°æº¯¼ö¸¦ ÅëÇØ¼ µ¥ÀÌÅ͸¦ ÁÖ°í ¹Þ¾Ò´Ù. ¿©±â¼ Ç¥ÁØ ÀÔÃâ·ÂÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀ̳ª, »ç¿ëÇÒ È¯°æ º¯¼ö Á¤ÀÇ µîÀÌ CGIÀ̸ç, ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º¸¦ µû¸£´Â ÇÁ·Î±×·¥Àº CGI ÇÁ·Î±×·¥À̶ó°í ÇÑ´Ù.
#!/usr/bin/ruby
print "HTTP/1.0 200 OK\r\n"
print "Content-type: text/html\r\n\r\n"
print "<html><body>Hello World!</body></html>\r\n"
À¥¼¹ö°¡ ÀÚµ¿À¸·Î Çì´õ¸¦ ºÙ¿©ÁÖÁö ¾Ê´Â´Ù¸é ÀÌ·¸°Ô Á÷Á¢ Çì´õ¸¦ Ãß°¡ÇØ¾ß ÇÑ´Ù.
±×¿Ü¿¡µµ ¿äÃ»ÇØ¼®, ¼¼¼Ç°ü¸®, Äí±â´Ù·ç±â, Ãâ·Â À̽ºÄÉÀÌÇεîÀ» Á÷Á¢ ¸¸µé¾î¾ß ÇÏÁö¸¸ À̰͵éÀ» ½±°Ô ÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù. cgi.rb »ç¿ëÇϱâ
URL°ú HTML Äڵ带 ´Ù·ê ¶§, ¾î¶² ¹®ÀÚ´Â ÁÖÀÇÇØ¼ ´Ù·ç¾î¾ß ÇÑ´Ù.
| ¹®ÀÚ | URLÄÚµå |
| / | %2F |
| (°ø¹é) | + |
| & | %26 |
·çºñ¿¡¼´Â ÀÌ·± URL escape¹®ÀÚ¸¦ ´Ù·ç±â À§ÇÑ ¹æ¹ýÀÌ Á¸ÀçÇÑ´Ù.
CGI.escape()¿Í CGI.unescape()Àε¥ ¹®ÀÚ¿À» esacape ¹®ÀÚ¿·Î º¯È¯/¿ªº¯È¯ ½ÃÄÑÁØ´Ù.
HTML Ư¼ö¹®ÀÚ´Â CGI.escapeHTML()°ú CGI.unescapeHTML()ÀÌ ÀÖ´Ù.
HTMLÀÇ ¿ä¼ÒÁß¿¡ Ưº°È÷ ÀÓÀÇÀÇ ¿ä¼Ò¸¸ À̽ºÄÉÀÌÇÁ Çϱâ À§Çؼ´Â CGI.escapeElement(), CGI.unescapeElement()¸¦ »ç¿ëÇÑ´Ù.
CGI Ŭ·¡½º´Â Æû µ¥ÀÌÅ͸¦ Á¢±ÙÇϱâ À§ÇØ ¸î°¡Áö ¹Ù¾÷À» Á¦°øÇÑ´Ù.
ƯÁ¤ ¸Å°³º¯¼ö°¡ ¿äû¾È¿¡ Á¸ÀçÇÏ´ÂÁö ¿©ºÎ´Â CGI#has_key?¸¦ ÀÌ¿ëÇØ ¾Ë ¼ö ÀÖ´Ù.
Äõ¸® ¸Å°³º¯¼ö
HTTP¿¡ ´ëÇÑ ¿äûÀº ¸Å°³º¯¼ö¸¦ Æ÷ÇÔÇÒ ¼ö ÀÖ´Ù.
ÀÌ ¸Å°³º¯¼ö´Â URLÀϺΠ¶Ç´Â º»¹®³»¿¡ ³»ÀåµÈ ÇüÅ·ΠÀü´ÞµÈ´Ù.
ù°. CGI°´Ã¼¸¦ ÇØ½Ãó·³ °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹®Á¦´Â ÇϳªÀÇ À̸§¿¡ ¿©·¯ °ªÀÌ Æ÷ÇԵǸé Çϳª¸¸ ¹Þ¾Æ¿Ã¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù.
¿¹) cgi = CGI.new
cgi'name'? # -> À̸§
cgi'reason'? # -> flexible
µÎ¹øÂ°. CGI#param()¸¦ ÀÌ¿ëÇØ ³Ñ°Ü¿À´Â ¸ðµç°ªÀ» ¿äûÇÒ ¼ö ÀÖ´Ù. ¿ª½Ã³ª ÇØ½ÃÀÇ ÇüÅ·Π³Ñ¾î¿ÀÁö¸¸ °¢ °ªÀº ¹è¿ÀÇ ÇüÅ·Π³Ñ¾î¿Â´Ù. À§ÀÇ ¹®Á¦Á¡À» ÇØ°áÇÑ ¹æ¹ýÀÌ´Ù. HTML »ý¼ºÇϱâ
19Àå ·çºñ Tk
20Àå ·çºñ¿Í À©µµ¿ì(Microsoft Windows)
21Àå ·çºñ È®ÀåÇϱâ
3ºÎ ·çºñ ¿Ï¼ºÇϱâ
22Àå ·çºñ ÇÁ·Î±×·¡¹Ö ¾ð¾î
23Àå ¿À¸® ŸÀÔ
24Àå Ŭ·¡½º¿Í °´Ã¼
25Àå ·çºñ ¾ÈÀüÇÏ°Ô ½ÇÇàÇϱâ
26Àå ¸®Ç÷º¼Ç, ObjectSpace?, ºÐ»ê ·çºñ 4ºÎ ºÎ·Ï
ºÎ·Ï A Áö¿ø
ºÎ·Ï B Âü°í ÀÚ·á
ºÎ·Ï C À¯´Ï ÄÚµå Áö¿ø(by °¹®½Ä)
ºÎ·Ï D °³¹ß ȯ°æ(by °¹®½Ä) (º°Ã¥) 5ºÎ ·çºñ ¶óÀ̺귯¸® ·¹ÆÛ·±½º
27Àå ³»Àå Ŭ·¡½º¿Í ¸ðµâ
28Àå Ç¥ÁØ ¶óÀ̺귯¸® (º°Ã¥) 6ºÎ ºÎ·Ï
ºÎ·Ï A ¼ÒÄÏ ¶óÀ̺귯¸®
ºÎ·Ï B MKMF ·¹ÆÛ·±½º
EditText
of this page
(last modified 2008-11-05 11:01:08)
FindPage
by browsing, searching, or an index
Or try one of these actions:
DeletePage,
DeleteUploadedFile,
LikePages,
SpellCheck,
UploadFile