February 2009
Volume 24 Number 02
.NET ã¨ã®ç¸äºéç¨æ§ - IronRuby 㨠RSpec ã®æ¦è¦ (第 1 é¨)
Ben Hall | February 2009
ãã®è¨äºã¯ãIronRuby ã®ãã¬ãªãªã¼ã¹çã«åºã¥ãã¦ãã¾ããããã«è¨è¼ããã¦ãããã¹ã¦ã®æ å ±ã¯ãå¤æ´ãããå ´åãããã¾ãã
ãã®è¨äºã§ã¯ã次ã®å 容ã«ã¤ãã¦èª¬æãã¾ãã
|
ãã®è¨äºã§ã¯ã次ã®ãã¯ããã¸ã使ç¨ãã¦ãã¾ãã IronRuby |
ã³ã¼ã㯠MSDN ã³ã¼ã ã®ã£ã©ãªã¼ãããã¦ã³ãã¼ãã§ãã¾ãã
ãªã³ã©ã¤ã³ã§ã®ã³ã¼ãã®åç
§
ç®æ¬¡
ã³ã¼ãã§è¦ä»¶ã¨ãµã³ãã«ãå®ç¾©ãã
Ruby 㨠Duck Typing
Ruby ã¨ã¡ã¿ããã°ã©ãã³ã°
Ruby 㨠.NET Framework
Ruby 㨠CLR
IronRuby ã®å
é¨
IronRuby ã使ç¨ã㦠C# ã¢ããªã±ã¼ã·ã§ã³ããã¹ããã
ä»å¾ã®äºå®
ãæã ããé¡ãããã®ã¯ãããªãã®ããããã¾ãã!ããããããã»ã¨ãã©ã®éçºè ããææ°ã®ãã«ãã®ç´åç´å¾ã«é¡§å®¢ãããã®ãããªæè°ãåãããã¨ãããã¯ãã§ãã顧客ãæ°ã®æ¯ãªéçºè ã«å£°ãèããçç±ã¯ãè¦æ±ããäºæãæ£ããç解ããã¦ããªãã£ããåã«ã·ã¹ãã ã®ä¸é¨ãæ©è½ããªãã£ããªã©ããã¾ãã¾ã§ãã
顧客ãèªèº«ã®è¦ä»¶ãæ確ã«ææ¡ãã¦ããªããã¨ã¯ããããã¾ããããã®ãããªé¡§å®¢ã¯å®å ¨çã¨ãã¦ãã·ã¹ãã ã«æãããããå¦çã 100 ãã¼ã¸ã«åã¶æè¡ææ¸ã§å®ç¾©ãããã¨ãã¾ããä¸æ¹ãéçºè ã¯ãã¢ããªã±ã¼ã·ã§ã³ã«æ±ãããã¦ããåä½ãç解ããæ©è½ãæãªããã¨ãªãæ°ããè¦ä»¶ãå®è£ ãããã¨ãã¦ãææ¸åããã¦ããªãã¬ã¬ã· ã³ã¼ãã¨æ ¼éãã¾ãã
æ代ã¯å¤ããã¤ã¤ããã¾ããã½ããã¦ã§ã¢éçºã®æ°ããã¢ããã¼ãã®ç®çã¯ããããã®åé¡ã解決ããéçºè ãå·¥ç¨ã«æ¯éãæ¥ããã¨ãªãæåã®æ®µéãã顧客ã®è¦æ±ãæºãããããã«æ¯æ´ãããã¨ã§ãããããã®ã¢ããã¼ãã§ã¯ãéçºã®ãµã¤ã¯ã«ãå¤§å¹ ã«ç縮ãã¤ã¤ãèªã¿ããã管çã容æãªã³ã¼ããä½æã§ãã Ruby ãªã©ã®è¨èªãæ´»ç¨ãã¾ãã
ãã®è¨äºã§ã¯ãRuby 㨠IronRuby ã«ã¤ãã¦ç´¹ä»ããã¨å ±ã«ãMicrosoft .NET Framework ãã¼ã¹ã®ã³ã¼ãã¨ã® Ruby ã®ç¸äºéç¨æ§ã®åºæ¬ã説æãã¾ããã¾ããRSpec ãªã©ã®ãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ãã¦ãªãã¸ã§ã¯ãã®ç®çã®åä½ã®ãµã³ãã«ãçæãããã®åä½ã®ããã¥ã¡ã³ããæä¾ããæ¹æ³ã¨ãã·ã¹ãã ãé©åã«æ§ç¯ããã¦ãããã¨ãæ¤è¨¼ããæ¹æ³ã«ã¤ãã¦ã説æãã¾ãã次åã®è¨äºã§ã¯ãåãå ¥ããã¹ãã®è©³ç´°ã¨ IronRuby ã使ç¨ããåãå ¥ããã¹ãã®ä½ææ¹æ³ã説æãã¾ããä»åã®å 容ãè¸ã¾ããããã§ãèªã¿ãã ããã
ã³ã¼ãã§è¦ä»¶ã¨ãµã³ãã«ãå®ç¾©ãã
ç°¡åã«ãµã³ãã«ãè¨è¿°ããè¦ä»¶ãå®ç¾©ã§ããããã«ããã«ã¯ããã¬ã¼ã ã¯ã¼ã¯ãå¿ è¦ã§ããèªååãå ¥ããã¹ããå®è¡å¯è½ãªä»æ§ã¯ããã¾ãã¾ãªæ¹æ³ã§è¨è¿°ã§ãã¾ããä¸è¬ç㪠xUnit ãã¹ã ãã¬ã¼ã ã¯ã¼ã¯ããã¾ãå©ç¨ãã¦ããéçºè ãããã°ãFit ããã³ Fitness ãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ãã¦ããéçºè ããã¾ããçè ã¯ãæ¯èé§åéçº (BDD) ãå©ç¨ããã®ãæé©ãªã¢ããã¼ãã§ããã¨èãã¦ãã¾ããDan North æ°ã®èæ¡ãã JBehave ã¨å¼ã°ãã BDD ãã¬ã¼ã ã¯ã¼ã¯ã¯ãæè¡çç¥èã®ç¨åº¦ãåããããã¼ã å ¨å¡ãç解ã§ããå½¢ã§ã¢ããªã±ã¼ã·ã§ã³ã®åä½ã示ããã·ããªãªãå®ç¾©ããããã®æ段ã§ãã
JBehave ã¯ãNorth æ°ããã¹ãé§åéçº (TDD) ã§ç´é¢ããåé¡ã®è§£æ±ºçã¨ãã¦çã¿åºããããã®ã§ãããJava è¨èªåãã«å®è£ ããã¦ãã¾ããNorth æ°ã¯ãã®å¾ãRBehave ãä½æãã¦ãã¾ããRBehave ã¯ã人æ°ã®é«ã Ruby åããã¬ã¼ã ã¯ã¼ã¯ã§ãã RSpec ã«çµ±åããã¦ãã¾ããRSpec ã¯ãBDD ã® 2 種é¡ã®ã¢ããã¼ãã«å¯¾å¿ãã¦ãã¾ããã¢ããªã±ã¼ã·ã§ã³ã®åä½ã示ãã¹ãã¼ãªã¼ã¨ã·ããªãªã«åºã¥ã Dan North æ°ã®ã¢ããã¼ãã¨ããªãã¸ã§ã¯ã ã¬ãã«ã§ãµã³ãã«ãä½æãããã¨ã«éããç½®ãã Dave Astels æ°ã®ã¢ããã¼ãã§ãã
C# ã«ããNSpec ã NBehave ãªã©ãããã¤ãã® BDD ãã¬ã¼ã ã¯ã¼ã¯ãããã¾ããC# ã§ãã¹ããè¨è¿°ããå ´åã®ä¸»ãªåé¡ç¹ã¯ãä½åãªæ§é ä¸ã®è¦ç´ ãã¡ã¿ãã¼ã¿ (ä¸ãã£ããpublicãprivate ãªã©) ãããããã«ããã¹ãã®çã®æå³ãè¦å¤±ãããã¡ã«ãªããã¨ã§ããç·åçã«è¦ã¦ãC# 㨠NSpec/NBehave ã®çµã¿åããããã IronRuby 㨠RSpec ã®æ¹ã使ãåæãè¯ãã¨è¨ããã§ããããããã¦ãããC# éçºè ã«ã¨ã£ã¦ããã大ããªåé¡ã¨ãªã£ã¦ãã¾ãããC# ã¢ããªã±ã¼ã·ã§ã³ã®ãã¹ãã« Ruby ãã¼ã¹ã® RSpec ã使ç¨ã§ããªãã£ãããã§ããããã IronRuby ãããã°ããã®åé¡ã¯è§£æ±ºãã¾ãã
IronRuby ã®éçºã¯ã¾ã å§ã¾ã£ãã°ããã§ãããIronRuby ã¯åçè¨èªã©ã³ã¿ã¤ã (DLR) ãæ´»ç¨ã㦠CLR ä¸ã« Ruby è¨èªã®å®è£ ãä½æãã¾ããIronRuby ãå©ç¨ããã¨ã.NET Framework 㨠.NET æºæ ã®è¨èªã¨å ±ã«ãæ¢åã® Ruby ã¢ããªã±ã¼ã·ã§ã³ã¨ãã¬ã¼ã ã¯ã¼ã¯ãæ¡ç¨ã§ãã¾ãããã®çµæãRuby è¨èªã¨ RSpec ã使ç¨ã㦠C# ã¢ããªã±ã¼ã·ã§ã³ããã¹ããããã¨ãã§ãã¾ãã
è¨èªã¨ãã¦ã® Ruby ã¯ç°¡æ½ã§ãããã®ãããè¨è¿°ããã³ã¼ãã®éãæããã³ã¼ããã¯ããã«èªç¶ãªå½¢ã§è¡¨ç¾ãããã¨ãã§ãã¾ãããããã£ã¦ãã³ã¼ãã®ç®¡çãç°¡åã«ãªãã¾ãããã¨ãã°ããã¡ã¤ã«ãããã¹ã¦ã®ããã¹ãè¡ãèªã¿åããã³ã³ã½ã¼ã«ã«æ¸ãåºãã«ã¯ã次ã®ããã«è¨è¿°ãã¾ãã
File.readlines('AboutMicrosoft.txt').map {|line| puts line}
ãã®ã³ã¼ã㯠AboutMicrosoft.txt ãã¡ã¤ã«ãéãããã¹ã¦ã®è¡ãèªã¿åã£ãå¾ãåè¡ããã©ã¡ã¼ã¿ã¨ãã¦ãããã¯ã«æ¸¡ãã¾ãããã®å¾ããã©ã¡ã¼ã¿ãã³ã³ã½ã¼ã«ã«æ¸ãè¾¼ã¾ãã¾ããRuby ã«ããããããã¯ã¯ãä¸ãã£ãã«å²ã¾ããã¹ãã¼ãã¡ã³ãã®ã³ã¬ã¯ã·ã§ã³ã§ããC# ã«ãããã¡ã½ããã®å¼ã³åºãã«ä¼¼ã¦ãããyield ã¹ãã¼ãã¡ã³ãã使ç¨ãã¦å¼ã³åºãå´ã¡ã½ããã«å¶å¾¡ãè¿ãã¾ãã
èªç¶è¨èªçãªã¢ããã¼ããå¯è½ã¨ããã®ããRuby ããã¹ãã«å½¹ç«ã¤çç±ã® 1 ã¤ã§ããRuby ã使ç¨ããã¨ããã¹ã (ãã®å ´åã¯ã·ããªãª) ãæ ¼æ®µã«ãããããããªãã¾ãã
Ruby 㨠Duck Typing
Ruby ã¨åçè¨èªã®æ¹ãå¤èªããããçç±ã® 1 ã¤ã¯ãåæå®ã®å¦çæ¹æ³ã«ããã¾ããRuby ã§ã¯ãéçºè ã¯åãæå®ãã¾ããããã®ä»£ããã«ãã³ã¼ãã®ä¸ææã«å¤æ°ã®åãæ¨å®ããã¾ããè¨èªã¯ä¾ç¶ã¨ãã¦å³å¯ã«åæå®ããã¦ãã¾ãããå¤æ°ã®åã¯åçã«æ±ºå®ããã¾ãã
C# ã§ã¯ãå®è£ ã®ã³ã³ãã©ã¯ããå®ç¾©ãã¤ã¤ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãªãã¸ã§ã¯ããåé¢ã§ãã¾ããRuby ã®å ´åã¯ãã³ã³ãã©ã¯ããã¤ã³ã¿ã¼ãã§ã¤ã¹ã¯å¿ è¦ããã¾ããããªãã¸ã§ã¯ãã«å¼ã³åºãã¦ããã¡ã½ããã®å®è£ ãããå ´åã¯ããã®å®è£ ãå¼ã³åºããã¾ãããªãå ´åã¯ãã¨ã©ã¼ãè¿ããã¾ãããã®ããã«ããªãã¸ã§ã¯ãã®ã³ã³ãã©ã¯ãã¯ãã³ã¼ãã®ä»ã®é¨åã¨ã®é¢ä¿ã§ã¯ãªãããã®å®è£ ã«ãã£ã¦å®ç¾©ããã¾ãã
ãããå ·ä½çã«ç¤ºãããã«ãçè ã¯å¤ãåãåãã¡ã½ãããä½æãã¾ããããã®å¤ã®åã¯ãå®è¡æã«æ¨å®ããã¾ãããã®å¾ãã¡ã½ãã㯠Hello ã¨å¤ãåºåãã¾ãã
def SayHello(val)
puts "Hello #{val}"
end
åã¯ãã®ãããªæ¹æ³ã§å¦çããããããã³ã¼ããä¸åå¤æ´ãããã¨ãªãæååã¨æ´æ°ã®ä¸¡æ¹ã«åãã¡ã½ãããå©ç¨ã§ãã¾ãã
SayHello("Test") => "Hello Test"
SayHello(5) => "Hello 5"
Ruby ã§ã¯ä¸ãã£ããçç¥ã§ãããããä¸ãã£ããªãã§ã¡ã½ãããå¼ã³åºããã¨ãã§ãã¾ãããããããã¨ã§ãæ§æãæ ¼æ®µã«ãããããããªãã¾ãã
SayHello "Test" => "Hello Test"
C# ã§ããªãã¸ã§ã¯ãã使ç¨ãã¦åããã¨ãå¯è½ã§ããããªãã¸ã§ã¯ãããã£ã¨è¤éãªå ´åã¯ã©ããªãããè¦ã¦ã¿ã¾ããããçè 㯠GetName ã®å¼ã³åºãã®çµæãåºåããæ°ããã¡ã½ãããå®ç¾©ãã¾ããããã©ã¡ã¼ã¿ n ã®å¤ã GetName ã¨ããã¡ã½ãããå®è£ ãã¦ããéããã³ã¼ãã¯æ£å¸¸ã«æ©è½ãã¾ãã
def outputName(n)
puts n.GetName()
end
ç¡é¢ä¿ãª 2 ã¤ã®ã¯ã©ã¹ã次ã«ç¤ºãã¾ãã
class Person
attr_accessor :name
def GetName()
@name
end
end
class Product
def GetName()
"The product with no name"
end
end
Person ã«ã¯ name å¤æ°ãè¨å®ã§ããã¢ã¯ã»ãµãããã¾ããä¸æ¹ãProduct ã¯ãã¼ãã³ã¼ãã£ã³ã°ãããå¤ãè¿ãã¾ããRuby ã§ã¯ return ã¹ãã¼ãã¡ã³ããè¨è¿°ããå¿ è¦ãããã¾ãããæ¢å®ã§ã¯ãã¡ã½ããã®ã³ã¼ãã®æçµè¡ã®æå¾ã®çµæãè¿ããã¾ãã
outputName ã¡ã½ãããå¼ã³åºã㨠GetName ã¡ã½ãããå¼ã³åºããã¾ãããã®ãã¨ãããRuby ã®åæå®ã§ã¯ã¡ã½ãããåä¸ã®åã«ç¸ãããªããããã³ã¼ãã®åå©ç¨æ§ãé«ã¾ãã¨ãããã¨ããããã¾ãã
outputName(Product.new) => "The product with no name"
$x = Person.new
$x.name = "Ben Hall"
outputName($x) => "Ben Hall"
GetName ãå®è£ ãã¦ããªãå¼æ°ã使ç¨ãã¦ã¡ã½ãããå¼ã³åºãã¨ãNoMethodError ãçæããã¾ãã
outputName("MyName") => :1:in 'outputName': \
undefined method 'GetName' \
for MyName:String (NoMethodError)
ãã®æ¦å¿µã«ä¸é¨ã®éçºè ã¯ã¨ã¾ã©ãããããã¾ãããããã¹ãã®å®¹ææ§ãé«ããã¢ããªã±ã¼ã·ã§ã³ã®ãã¶ã¤ã³ãæ¹åã§ãããããè¦ãã¦ããã¦æã¯ããã¾ãããç¹ã« C# ã¢ããªã±ã¼ã·ã§ã³ããã¹ãããå ´åã«å½¹ç«ã¤æ¦å¿µã§ãããã®å 容ã«ã¤ãã¦ã¯ã次ã®ã»ã¯ã·ã§ã³ã§èª¬æãã¾ãã
Ruby ã¨ã¡ã¿ããã°ã©ãã³ã°
ä»ã®åçè¨èªã¨åãããã«ãRuby ã«ãã¡ã¿ããã°ã©ãã³ã°ã®æ¦å¿µãåãå ¥ãããã¦ãã¾ãããã®ãããå®è¡æã«ä»»æã®ã¯ã©ã¹ããªãã¸ã§ã¯ããæ¡å¼µããããã¡ã½ããã¨åä½ãå®è¡æã«å®ç¾©ãããã§ãã¾ããã¾ããèªå·±æ¸ãæãã¢ããªã±ã¼ã·ã§ã³ã®éçºãå¯è½ã«ãªãã¾ããããã¯åçè¨èªã«ããã¦é常ã«å½¹ç«ã¡ãç¹ã«åä½ãã¹ããä½æããå ´åã«æç¨ã§ããç¬èªã®è¦ä»¶ã«åããã¦ãªãã¸ã§ã¯ãã¨ã¡ã½ããã®åä½ãã«ã¹ã¿ãã¤ãºã§ããããã§ãã
åæ§ã®æ¹æ³ã§ãçµã¿è¾¼ã¿ã® Ruby ã¯ã©ã¹ãæ¡å¼µããC# 3.0 ã®æ¡å¼µã¡ã½ããã¨ããä¼¼ãç¬èªã®æ©è½ãæä¾ã§ãã¾ããC# ã®å ´åã¯ãä½æã§ããã¡ã½ããã«ã¤ãã¦ãã¾ãã¾ãªå¶éã課ããã¾ãããã¨ãã°ãä½æã§ããã®ã¯åå¥ã®ã¯ã©ã¹ã«å«ã¾ããéçã¡ã½ããã«éããã¾ããããããå¶éã®ãããå¯èªæ§ãæãªããã¾ããRuby ã®å ´åã¯ãæ¢åã®ã¯ã©ã¹ã«é常ã®ã¡ã½ãããä½æãã¾ããæ´æ°ãå¦çãã Integer ã¨ããã¯ã©ã¹ãä¾ã«èãã¦ã¿ã¾ããããInteger ã«ã¯ä¸é£ã®ã¡ã½ãããããã¾ãããæ°å¤ãå¶æ°ãã©ãããå¤æããã¡ã½ããã¯ããã¾ããã
ãã®ãããªã¡ã½ãããä½æããå ´åã¯ãåãåå (Integer) ã®ã¯ã©ã¹ãæ°ãã«ä½æããæ°ããã¡ã½ãããå®ç¾©ãã¦ãã ãããå¤èªããããããããã«ãã¡ã½ããæ«å°¾ã«ã¯ Boolean å¤ãè¿ããã¨ã示ãçå符ã追å ããã¦ãã¾ãã
class Integer
def even?()
self.abs % 2 == 0
end
end
puts 2.even? => true
puts 1.even? => false
Ruby 㨠.NET Framework
IronRuby ãå©ç¨ããã¨ã¸ã§ãã«æé©ãªè¨èªã使ç¨ã§ãããããéçè¨èªã¨åçè¨èªã®ã©ã¡ãã使ç¨ãã¹ããã¨ãããããã¡ãªè°è«ãè¡ãå¿ è¦ããªããªãã¾ããC# ã®æ¹ãé©ãã¦ããå ´åã¯ãC# ã使ç¨ã§ãã¾ããããåçãªã¢ããã¼ããã¨ãå¿ è¦ãããå ´åã«ã¯ç°¡åã« IronRuby ã使ç¨ã§ãã.NET ã¨ã®ç¸äºéç¨æ§ã Ruby è¨èªã®åçãªæ§è³ªãæ´»ãããã¨ãã§ãã¾ãã主è¦ãªã¢ããªã±ã¼ã·ã§ã³ã«ã¯ C#ããã¹ãã«ã¯ Ruby ã¨ããå ·åã«ãç°ãªãè¨èªã¨ãã¯ããã¸ãçµã¿åããã¦ä½¿ç¨ãããã¨ããå§ããã¾ãã
DLR ã¯ã.NET ã¨ã®ç¸äºéç¨ãå¯è½ã«ããããã®åå°ã§ããDLR ãããã°ãWindows ãã©ã¼ã ãWindows Presentation Foundation (WPF)ãSilverlight ãªã©ã® UI ãã¯ããã¸ãæ´»ç¨ããªãããRuby ã§ã¢ããªã±ã¼ã·ã§ã³ ã³ã¼ããè¨è¿°ã§ãã¾ãã
IronRuby ãã WPF ãå©ç¨ããã®ã¯ããã£ã¦ç°¡åã§ãã次ã®ã³ã¼ããå®è¡ããã¨ãå®å ¨ã«æ©è½ãã WPF ã¦ã£ã³ãã¦ã IronRuby ããä½æã§ãã¾ããC# ã®å ´åã¨åãããã«ãrequire ã¹ãã¼ãã¡ã³ãã使ç¨ãã¦ã.NET Framework 3.0 ã«å«ã¾ãã¦ãã 2 ã¤ã® WPF ã¢ã»ã³ããªã¨ mscorlib ãåç §ãã¦ãã ããã
require 'mscorlib'
require 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
require 'PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'
ããã§ãWPF ãªãã¸ã§ã¯ããä½æãã対話ã§ãã¾ããã¾ãã使ç¨ãããã¹ã¦ã®ãªãã¸ã§ã¯ãã®ã¨ã¤ãªã¢ã¹ãä½æãã¾ãããããããã¨ã§ããªãã¸ã§ã¯ãã«ãã®åå空éãä»ãã¦ã¢ã¯ã»ã¹ããå¿ è¦ããªããªããããã³ã¼ãããã£ãããã¾ãã
Window = System::Windows::Window
Application = System::Windows::Application
Button = System::Windows::Controls::Button
次ã«ãWPF ã¦ã£ã³ãã¦ãä½æããã¿ã¤ãã«ãä»ãã¾ãã
win = Window.new
win.title = 'IronRuby and WPF Interop'
åãæ¹æ³ã§ãã¿ã³ãä½æãã¾ãã
mainButton = Button.new
mainButton.content = "I'm a WPF button â press me"
ã©ã¡ãã®ã¤ã³ã¹ã¿ã³ã¹ã§ãããªãã¸ã§ã¯ãã®å®å ¨ãªååã«ã¢ã¯ã»ã¹ããããã«ã¨ã¤ãªã¢ã¹ã使ç¨ãã¦ãã¾ããããã§ã¯ããã¿ã³ãã¯ãªãã¯ãããã¨ãã«ã¦ã¼ã¶ã¼ã«ã¡ãã»ã¼ã¸ ããã¯ã¹ã表示ãããã¨ã«ãã¾ããC# ã®å ´åã¨åæ§ã«ã¤ãã³ãããµãã¹ã¯ã©ã¤ãããã¯ãªã㯠ã¤ãã³ããçºçããã¨ãã«å¼ã³åºããããããã¯ãæä¾ã§ãã¾ãã
mainButton.click do |sender, args|
System::Windows::MessageBox.Show("Created using IronRuby!")
end
æå¾ã«ãã¦ã£ã³ãã¦ã®ã³ã³ãã³ãããã¿ã³ã¨ãã¦è¨å®ããæ°ãã Application ãªãã¸ã§ã¯ããä½æãã¦ãããã¦ã£ã³ãã¦ãèµ·åãã¾ãã
win.content = mainButton
my_app = Application.new
my_app.run win
å³ 1 IronRuby ã使ç¨ã㦠WPF ã¢ããªã±ã¼ã·ã§ã³ãä½æãã
ããã§ãæ£ããé¢é£ä»ãããã¦ããã¯ãªã㯠ã¤ãã³ããçºçããã¨ãå³ 1 ã«ç¤ºãå®å ¨ã«ã¤ã³ã¿ã©ã¯ãã£ã㪠WPF ã¦ã£ã³ãã¦ã表示ãããããã«ãªãã¾ãããããã§ã¯ãRuby ã©ã¤ãã©ãªã¨å¯¾è©±ããã¨ãã¨åãæ¹æ³ã§ .NET Framework ã¨å¯¾è©±ãã¦ãã¾ããJohn Lam æ°ã¨ãã¼ã ã主張ããåºæ¬çãªããªã³ã·ãã«ã® 1 ã¤ã¯ãRuby è¨èªã«å¿ å®ã§ããã¨ãããã¨ã§ããããã¯ãIronRuby ã¸ã®ç§»è¡ã ããçç±ã« Ruby ã¢ããªã±ã¼ã·ã§ã³ã®ä½ææ¹æ³ã¾ã§ã¯å¤ããããªãã¨èããæ¨ä»ã® Ruby éçºè ã«ã¨ã£ã¦ã大æè¿ã®ããªã³ã·ãã«ã§ãããªãããªãã¹ã¦ã® .NET ã³ã¼ãã«åãæ¹æ³ã§ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ãã
Ruby 㨠CLR
ããã§ãã 1 ã¤ä¾ãç´¹ä»ãã¾ããIEnumerable ã® AddRange ã«ã¢ã¯ã»ã¹ããå ´åãC# ã®ã³ã¼ãã¯æ¬¡ã®ããã«ãªãã¾ãã
ArrayList list = new ArrayList();
list.AddRange(new [] { 1,2,3,4 });
ãã ã Ruby ã§ã¯ãå¯èªæ§ãé«ããããã«ãã¡ã½ããåã®ä¸ã®åèªãã¢ã³ãã¼ã¹ã³ã¢ã§åããã¨ããè¦åãä¸è¬ã«èªãããã¦ãã¾ãããã®è¦åã«å¾ãããã«å¥ã®ã©ã¤ãã©ãªãä½æããã®ã¯ãæéããããããããããééãã®å ã§ãããµã¼ããã¼ãã£ã®éçºä½æ¥ã®å©ãã«ããªãã¾ããã
ããã§ãCLR ãªãã¸ã§ã¯ãã®å ´åãIronRuby 㯠Ruby ã®ã¡ã½ããå¼ã³åºãã CLR ç¨ã®åçã®ã¡ã½ããåã«å¤æãã¾ãã
$list = ArrayList.new
$list.add_range([1,2,3,4])
ããã§ã¯ãRuby ã®ã¢ããã¼ãã«æ²¿ã£ã¦ AddRange ã¡ã½ããã«ã¢ã¯ã»ã¹ãã¦ãã¾ããã¡ã½ããåã¯å°æåã§è¡¨ãããåèªã¯ã¢ã³ãã¼ã¹ã³ã¢ã§åºåããã¦ãã¾ããCLR ã®ååä»ãè¦åã«å¾ã£ã¦ãRuby ã§ã¡ã½ããåãæ®ãã¦ããã¾ãã¾ããã
$list.AddRange([1,2,3,4])
ã©ã¡ãã®ãã¿ã¼ã³ãåãããã«æ©è½ãã¾ããã©ã¡ãã使ããã¯ãå人ã®å¥½ã¿ã§ãã
æ¢ã«èª¬æããããã«ãRuby ã§ã¯ãªãã¸ã§ã¯ãã®åãå®è¡æã«æ¨å®ãã¾ãããã㯠C# ãªãã¸ã§ã¯ããå¦çããã¨ããåãã§ããç°ãªãåã®ãªãã¸ã§ã¯ããè¿ãä¸é£ã® C# ã¡ã½ããã«ã¤ãã¦èãã¦ã¿ã¾ããããåããªãã¸ã§ã¯ããè¿ãããã¨ããã¡ã½ãã ã·ã°ããã£ã¯ã¤ã³ã¿ã¼ãã§ã¤ã¹ãå ·è±¡åãè¿ãã¾ããçè ã®ä¾ã«ã¯ãåä¸ã® HelloWorld ã¡ã½ãããå®ç¾©ããã¤ã³ã¿ã¼ãã§ã¤ã¹ãããã¾ãã
public interface IHello {
string HelloWorld();
}
çè ã¯ãHello3Times ããç¶æ¿ãã Hello4Times ã¯ã©ã¹ãä½æãã¾ãããHello3Times ã¯ã¤ã³ã¿ã¼ãã§ã¤ã¹ããç¶æ¿ãã¾ãããããã« 3 ã¤ã® HelloWorld ã¡ã½ãããå®è£ ãã¦ãã¾ãããã®ã¯ã©ã¹ã«ãåºæ¬ã®å®è£ ãå¼ã³åºã HelloMethodOn4Times ã¨ããæ°ããã¡ã½ãããå®ç¾©ãã¾ãã
public class Hello4Times : Hello3Times {
public string HelloMethodOn4Times () {
return base.HelloWorld();
}
}
次ã«ãHello4Times ã¯ã©ã¹ã®æ°ããã¤ã³ã¹ã¿ã³ã¹ãè¿ã (ãã ããã¤ã³ã¿ã¼ãã§ã¤ã¹ã¨ãã¦å¼ã³åºãå´ã®ã³ã¼ãã«è¿ã) ã¡ã½ããã¨éçã¯ã©ã¹ãä½æãã¾ãããã®å ´åãå¼ã³åºãå´ã®ã³ã¼ã㯠HelloWorld ã ããèªèããã°ãããå®ç¾©ããã¦ãã追å ã®ã¡ã½ãããèªèããå¿ è¦ã¯ããã¾ããã
public static class HelloWorld {
public static IHello ReturnHello4TimesAsInterface() {
return new Hello4Times();
}
}
çè ã® Ruby ã³ã¼ãã«ã¯ãã¡ã½ããã®å¼ã³åºãã 2 ã¤ããã¾ããæåã®å¼ã³åºãã®å¯¾è±¡ã¯ãã¤ã³ã¿ã¼ãã§ã¤ã¹ã§å®ç¾©ããã¦ããã¡ã½ããã§ããããã«ã¯åé¡ããªãããã«æããã¾ãããã ãã2 ã¤ç®ã®å¼ã³åºãã®å¯¾è±¡ã¯å ·è±¡ã¯ã©ã¹ã®ã¡ã½ããã§ããIronRuby ã¯è¿ããããªãã¸ã§ã¯ãã®åãç¹å®ãã¦ãããã¡ã½ããå¼ã³åºãããã£ã¹ãããã§ãã¾ãã
puts InteropSample::HelloWorld.ReturnHello4TimesAsInterface.HelloWorld
puts interopSample::HelloWorld.ReturnHello4TimesAsInterface.HelloMethodOn4Times
ãããã®å¦çã¯ãã¹ã¦æ£å¸¸ã«è¡ããã¾ããã¡ã½ãããå¼ã³åºãããã«ãªãã¸ã§ã¯ããé©åãªåã«ãã£ã¹ãããå¦çãæ°ã«ãããå¿ è¦ã¯ããã¾ããã
次ã®ãã¼ãã«é²ã¿ã¾ãããã.NET ãªãã¸ã§ã¯ãããRuby ãªãã¸ã§ã¯ããæ¡å¼µããã®ã¨ã¾ã£ããåãæ¹æ³ã§æ¡å¼µã§ãã¾ããããã§ã¯ãã¡ãã»ã¼ã¸ ããã¯ã¹ã表示ããéã«ä½¿ç¨ããã¢ã¤ã³ã³ããã¿ã³ã¯æå®ãã¾ããããã®ä»£ããã«ãã¡ãã»ã¼ã¸ãæå®ãã¾ãã
ã·ã¼ã ã¬ã¹ãªå¯¾è©±ã®ããã«ãçµã¿è¾¼ã¿ã®æ©è½ã使ç¨ãã代ããã«å®éã® MessageBox ã¯ã©ã¹ãæ¡å¼µããå¿ è¦ãããå ´åãããã§ããããRuby ã使ç¨ããã°ãããããä½æ¥ã¯ç°¡åã§ããWPF ã®çµã¿è¾¼ã¿ã® MessageBox ã¨åãã¯ã©ã¹ãæ°ãã«å®ç¾©ãã¦ãã ããã次ã«ããã¾ãã¾ãªæ¢å®å¤ãæ㤠show ã¡ã½ãããå¼ã³åºãæ°ããã¡ã½ãããããã®ã¯ã©ã¹ã«ä½æãã¾ãã
class System::Windows::MessageBox
def self.ShowMessage(msg)
System::Windows::MessageBox.Show(msg, msg, \
System::Windows::MessageBoxButton.OK, \
System::Windows::MessageBoxImage.Stop)
end
end
ã³ã¼ãã®æ¬¡ã®ãããã¯ãå®è¡ããã¨ã
System::Windows::MessageBox.ShowMessage( \ "I'm going to show you a message")
ShowMessage ã¡ã½ãããå¼ã³åºããã¨ãã§ãã¾ãããã®çµæãå³ 2 ã®ã¡ãã»ã¼ã¸ ããã¯ã¹ã表示ããã¾ãã
å³ 2 Ruby ã§ã«ã¹ã¿ã ã®ã¡ãã»ã¼ã¸ ããã¯ã¹ã表示ãã
IronRuby ã®å é¨
ä½ãç¸äºéç¨ãå¯è½ã«ããã®ã§ããããããã®çã㯠DLR ã§ãã大ã¾ãã«è¨ãã¨ãIronRuby ã使ç¨ã㦠Ruby ã³ã¼ããå®è¡ããã¨ãèå¾ã§å¤æ°ã®å¦çãè¡ããã¾ããã¾ããè¨è¿°ããã³ã¼ãã IronRuby ã¨ã³ã¸ã³ã«ãã£ã¦ãã¼ã¯ã³åããã解æããã¾ãã次ã«ã解æãããã³ã¼ãã DLR ã®æ½è±¡æ§æããªã¼ (AST) ã«å¤æããã¾ããããã¯æ¨æºåããã AST ã§ããã³ã¼ããå®è¡ããããã«ã¯ãIronPython ãåãã¨ãããã¹ã¦ã®è¨èªå®è£ ã§ããã DLR ã«æä¾ããå¿ è¦ãããã¾ãã
DLR ã« AST ãæä¾ãããã¨ãDLR ã¯ããªã¼ãä¸éè¨èª (IL) ã«å¤æãã¾ããCLR ç¨ã®æ±ç¨è¨èªãæä¾ããããã«ããã¹ã¦ã® .NET ã³ã¼ãã IL ã«ã³ã³ãã¤ã«ããã¾ãããã®ãããªããã¿ã§ IronRuby 㨠.NET Framework éã®ç¸äºéç¨æ§ã確ä¿ããã¾ãããã®èå¾ã§ã¯ããã¹ã¦ã®ã³ã¼ãã IL å½ä»¤ã¨ãã¦å®è¡ããã¦ããã®ã§ããDLR ã¯å¤æãçµããã¨ãIL ãå®è¡ããããã« CLR ã«æ¸¡ãã¾ããããã¦çµæã IronRuby ã«è¿ããã¾ãã
ãã®ããã»ã¹ã§ã¯ãããã©ã¼ãã³ã¹ã¨ä¿¡é ¼æ§ãé«ããããã«ãã£ãã·ã¥ãªã©ã®è¿½å ã®å¦çãè¡ããã¾ãããã®è©³ç´°ã«ã¤ãã¦ã¯ãMSDN Magazine ã® 2007 å¹´ 10 æå·ã«æ²è¼ããã¦ãã Bill Chiles ã®ãCLR å¾¹åºè§£åãã³ã©ã (ãIronPython ã¨åçè¨èªã©ã³ã¿ã¤ã ã) ãåç §ãã¦ãã ããã
åå¥ã®ã¢ã»ã³ããªã«ã¯ãã¹ãã£ã³ã° API ãå«ã¾ãã¦ãã¾ããããã«ãã£ã¦ãèªåã®ã¢ããªã±ã¼ã·ã§ã³ã« IronRuby ãçµã¿è¾¼ã¿ãC# ãã Ruby ã³ã¼ããå®è¡ããããã¦ã¼ã¶ã¼ç¬èªã®ã³ã¼ããå®è¡ãããã§ãã¾ãã
IronRuby ã®å®è£ ã®è©³ç´°ã確èªããã«ã¯ãRubyForge ããã½ã¼ã¹ ã³ã¼ãå ¨ä½ããã¦ã³ãã¼ããã¦ãã ãããIronRuby 㯠C# ã§å®è£ ããããªã¼ãã³ã½ã¼ã¹ ããã¸ã§ã¯ãã§ãããåçè¨èªã®å®è£ ã®å¥½ä¾ã§ããIronPython ã¯ããªã¼ãã³ã½ã¼ã¹ ããã¸ã§ã¯ãã¨ã㦠CodePlex ã«ãã¹ãããã¦ãã¾ããDLR ã®åä½ã®ããã¿ã大ã¾ãã«ç¢ºèªããã«ã¯ãIronPython ããã¦ã³ãã¼ãããç¨æããã¦ãã ToyScript ã¨ãããµã³ãã«è¨èªã試ãã¦ã¿ã¦ãã ããã
ã³ã¢ Ruby ãã©ãããã©ã¼ã ã¨ã®äºææ§ãç¶æãç¶ãããããIronRuby ãã¼ã 㯠RubySpec ã使ç¨ãã¦ãã¾ããããã¯ãRuby è¨èªã®é©åãªå®è£ æ¹æ³ã«åºã¥ããµã³ãã«ã®å ±æã»ããã§ããRubySpec ã¯ãMatz ã® Ruby Interpreter (MRI)ãJRubyãMacRubyãIronRuby ãªã©ããã¾ãã¾ãªå®è£ ã®åä½ãçµ±ä¸ããããã«å©ç¨ããã¦ãã¾ããRubySpec ã§ã¯ãMSpec ã¨ãã RSpec ã®æ§æäºæãã¼ã¸ã§ã³ã使ç¨ãã¾ããããããåãçµã¿ã¯ãIronRuby ã®å®è£ ã®åãå ¥ããã¹ãã¨è¦ãªããã¦ãã¾ãã
IronRuby ã使ç¨ã㦠C# ã¢ããªã±ã¼ã·ã§ã³ããã¹ããã
ä½å¹´ãåãã TDD ã¯ã½ããã¦ã§ã¢ã®éçºææ³ã¨ãã¦æ³¨ç®ãããå©ç¨ãããå ´é¢ãå¢ãã¦ãã¦ãã¾ãããã®çµæããã¶ã¤ã³ã¨ä¿å®æ§ã®ç¹ã§åªããã³ã¼ããè¨è¿°ãããããã«ãªãããã°ã®æ°ãæãããã¦ãã¾ããIronRuby ãå©ç¨ããã¨ãTDD ã§ã¯ãªã BDD ã®ã¢ããã¼ãã«æ²¿ã£ã¦ RSpec ä»æ§ãã¬ã¼ã ã¯ã¼ã¯ã¨ã©ã³ãã¼ã使ç¨ããC# ãªãã¸ã§ã¯ãã®åä½ã®ãµã³ãã«ãæä¾ã§ãã¾ãã
ã·ããªãª ãã¬ã¼ã ã¯ã¼ã¯ã¯ãã¢ããªã±ã¼ã·ã§ã³ ã¬ãã«ã§ã®åãå ¥ããã¹ãåãã«èª¿æ´ããã¦ãã¾ã (ã·ããªãª ãã¬ã¼ã ã¯ã¼ã¯ã«ã¤ãã¦ã¯ãä»å¾ã®è¨äºã§åãä¸ããäºå®ã§ã)ãä¸æ¹ãä»æ§ãã¬ã¼ã ã¯ã¼ã¯ã¯ãå®è£ ããã³ã¼ãã®ç¬èªã®ä»æ§ã¨ããã®ç®çã®åä½ãè¨è¿°ããéçºè åãã«èª¿æ´ããã¦ãã¾ããä»æ§ãã¬ã¼ã ã¯ã¼ã¯ã¯ããªãã¸ã§ã¯ã ã¬ãã«ã§ã®åä½ã示ããµã³ãã«ãæä¾ãããã¨ã«éç¹ãç½®ãã¦æ§ç¯ããã¦ãã¾ãããããããµã³ãã«ãå®è¡ããã¨ãã·ã¹ãã ã®å®è£ ãéçºè ã®æå¾ ã©ããã«åä½ãã¦ãããã¨ãæ¤è¨¼ããã¨å ±ã«ããªãã¸ã§ã¯ãã®ç®çã®åä½ã示ããããã¥ã¡ã³ããæä¾ãããã¨ãã§ãã¾ãã
ããããNUnit ã MbUnit ãªã©ã®åä½ãã¹ã ãã¬ã¼ã ã¯ã¼ã¯ã¨ã®éè¦ãªéãã§ãããããã®ãã¬ã¼ã ã¯ã¼ã¯ã§ã¯ããã¹ãå±æ§ã使ç¨ãã¦ã¡ã½ãããã·ã¹ãã ã®ãã¹ãã§ãããã¨ã示ãã¾ããRSpec ã§ã®ã¢ããã¼ãã¯ç°ãªãã¾ããRSpec ã§ã¯ãåã¡ã½ãããã³ã¼ãã®ç®çã®åä½ã®ãµã³ãã«ã§ãããã¨ã示ãã¾ããäºç´°ãªéãã§ãããããã«ãã£ã¦ã使ç¨ããç¨èªãã¡ã½ããã®ç·¨ææ¹æ³ãTDD ã¨æ¯ã¹ãã¨ãã®æ¦å¿µã®ç解ã®ãããããªã©ããµã³ãã«ã®è¨è¿°æ¹æ³ãå¤ãã£ã¦ãã¾ããå¯æ¥ã«çµ±åããã IronRuby 㨠.NET FrameworkãBDDããã㦠RSpec ãæãã¨ãIronRuby ã使ç¨ãã C# ã¢ããªã±ã¼ã·ã§ã³ã®ãã¹ãã«çæã§ãã¾ããæå㪠RSpec ã®ä¾ã«ããã¦ãªã³ã° (Bowling) ã²ã¼ã ã®ããã°ã©ã ãããã¾ãããããå©ç¨ãã¦èãã¦ã¿ã¾ãããã
ã¾ããC# ã¢ã»ã³ããªå ã®ãã¦ãªã³ã° ã²ã¼ã ã®å®è£ ã«ã¢ã¯ã»ã¹ããå¿ è¦ãããã¾ãã
require File.dirname(__FILE__) + \ '/InteropSamples/Bowling/Bowling/bin/Debug/bowling.dll'
次ã«ãRSpec ã«ã¢ã¯ã»ã¹ãã¦ãã ããã
require 'rubygems'
require 'spec'
ãã®æç¹ã§ããµã³ãã«ã®è¨è¿°ãéå§ã§ãã¾ããããã¯ããã¦ãªã³ã°ã®å®è£ ã®ç®çã®åä½ã示ããµã³ãã«ã§ããRSpec ã¯ããµã³ãã«ãå®è¡å¯è½ã«ããããã«ä½¿ç¨ããå¿ è¦ã®ãããã¡ã¤ã³åºæè¨èª (DSL) ãæä¾ãã¾ããDSL ã®æåã®é¨å㯠describe ãããã¯ã§ããããã§ã¯åç´ã«ã"説æ" ãããªãã¸ã§ã¯ãããªãã·ã§ã³ã®èª¬æã¨å ±ã«è¨è¿°ãã¾ãããã®å ´åã¯ãC# ã§å®è£ ãã Bowling ãªãã¸ã§ã¯ããå®ç¾©ãã¾ãã
describe Bowling, " defines the bowling game" do
å¤èªããããããããã«ãã»ããã¢ãã㯠before ãããã¯ã§å®è¡ãã¾ãã
before(:each) do
@bowling = Bowling.new
End
ãã®æ®µéã¾ã§ãããããªãã¸ã§ã¯ãã¨å¯¾è©±ãããµã³ãã«ãä½æãã¦ãæ£ããåä½ãããã©ããã確èªãã¾ãã"it" ãããã¯ã使ç¨ãã¦ããµã³ãã«ã®ã³ã³ããã¹ãã¨ãã®å ·ä½çãªå 容ã示ãæååãæå®ãã¾ãã次ã«ãã·ã¹ãã ã¨å¯¾è©±ããã³ã¼ãã®ã»ã¯ã·ã§ã³ãè¨è¿°ããåä½ãé©åãã©ããã確èªãã¾ãã
it "should score 0 for a gutter game" do
20.times { @bowling.hit(0) }
@bowling.score.should == 0
end
end
C# ã®å®è£ ã¯ãåç´ã«æ¬¡ã®ããã«ãªãã¾ãã
public class Bowling {
public int Score { get; set; }
public void Hit(int pins)
{ Score += pins; }
}
æå¾ã«ãããå®è¡ããC# ãªãã¸ã§ã¯ãããã¹ããã RSpec ã§ãã¦ãªã³ã°ã®ãµã³ãã«ãæå¾ ã©ããã«åä½ãããã¨ã確èªãã¾ãã
>ir bowling_spec.rb
.
Finished in 1.0458315 seconds
1 example, 0 failures
ãã詳細ãªã¬ãã¼ããå¿ è¦ãªå ´åã¯ãspecdoc å½¢å¼ãé¸æã§ãã¾ãããã®å ´åããã¹ã¦ã®ãµã³ãã«ã¨ãªãã¸ã§ã¯ãã®èª¬æãåºåããããã¹ãã®çµæã示ããã¾ãã
>ir bowling_spec.rb --format specdoc
Bowling defines the bowling game
- should score 0 for a gutter game
Finished in 1.43728 seconds
1 example, 0 failures
ãã®è¨äºã®å·çæç¹ã§ã¯ãIronRuby ãã¼ã ã«ãããã¤ããªã®å®æçãªãªãªã¼ã¹ã¯è¡ããã¦ãã¾ããããã¼ã ã«ããã¨ãå®è£ ãäºææ§ãããã©ã¼ãã³ã¹ãæºè¶³ã®ããã¬ãã«ã«éãã¦ããå ¬å¼ã®ãã¤ããªããªãªã¼ã¹ããã¨ã®ãã¨ã§ãããã ããã½ã¼ã¹ ã³ã¼ãã¯èªç±ã«å©ç¨ã§ããã®ã§ãã³ã¼ãããã¦ã³ãã¼ããã¦èªåã§ãã«ãã§ãã¾ãã
ã½ã¼ã¹ ã³ã¼ãããã¦ã³ãã¼ãããã«ã¯ãmsysgit ãªã©ã® Git ã½ã¼ã¹ç®¡çã¯ã©ã¤ã¢ã³ããã¤ã³ã¹ãã¼ã«ããå¿ è¦ãããã¾ããIronRuby ã½ã¼ã¹ç®¡çã¯ãªã³ã©ã¤ã³ã§æä¾ããã¦ãã¾ãã詳細ã«ã¤ãã¦ã¯ãIronRuby ããã¸ã§ã¯ã ãµã¤ãããçè ã®ããã°è¨äºãDownloading IronRuby from GitHub (GitHub ãã IronRuby ããã¦ã³ãã¼ããã)ããåç §ãã¦ãã ãããã½ã¼ã¹ ã³ã¼ãããã¦ã³ãã¼ãããããVisual Studio 㧠IronRuby.sln ã½ãªã¥ã¼ã·ã§ã³ ãã¡ã¤ã«ã使ç¨ãã¦ã¢ã»ã³ããªãã³ã³ãã¤ã«ã§ãã¾ããã¾ããMRI ãã¤ã³ã¹ãã¼ã«ãã¦ããå ´åã¯ã次ã®ã³ãã³ãã§ã³ã³ãã¤ã«ã§ãã¾ãã
rake compile
IronRuby ãã³ã³ãã¤ã«ããããRSpec ãªã©ã®å種ã©ã¤ãã©ãªããã¦ã³ãã¼ããã¦ã追å æ©è½ãå ¥æãã¦ãã ãããRuby ã«ã¯ RubyGems ã®æ¦å¿µãåãå ¥ãããã¦ãã¾ãã"gem" ã¨ã¯ãæ©è½ã追å ã®ä¾åé¢ä¿ããã¦ã³ãã¼ããã¦å ¥æã§ããããã±ã¼ã¸ã®ãã¨ã§ããRSpec ããã¦ã³ãã¼ãããã«ã¯ãã³ãã³ã ããã³ããã§æ¬¡ã®ã³ãã³ããå ¥åãã¾ãã
gem install rspec
ããã§ãRuby ã³ã¼ããã RSpec ã©ã¤ãã©ãªã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ããããã ãæ¬ç¨¿å·çæç¹ã§ã¯ã1 ã¤ã 2 ã¤ã®ãã°ã®ãããRSpec 㨠IronRuby ãçµã¿åããã¦ä½¿ç¨ãããã¨ãã§ãã¾ããããã®è¨äºãå ¬éãããã¾ã§ã«ãã®åé¡ã解æ¶ããã¦ãããã¨ãæã¿ã¾ããRSpec ã®ãµãã¼ãã®ç¶æ ã確èªããã«ã¯ãRSpec ã® Web ãµã¤ãã IronRuby ã®ã¡ã¼ãªã³ã° ãªã¹ããåç §ãã¦ãã ããã
ãã°ãä¿®æ£ããã¦ããªãå ´åã«åãã¦ããã°ãä¿®æ£ãããã¤ããªã¨ RSpec ã©ã¤ãã©ãªãæºåãã¾ãã (注 : ãã¼ã ã«ãã£ã¦åé¡ãä¿®æ£ããã¦ããå ´åã¯ããã®ãã¼ã¸ã§ã³ã¯ä½¿ç¨ããªãã§ãã ãã)ã
é©åãªãã¤ããªãå ¥æããããIronRuby ã¤ã³ã¿ã¼ããªã¿ã§ãã ir.exe ã使ç¨ãã¦ãã³ã¼ããå®è¡ã§ãã¾ããåç´ã«ã³ãã³ã ã©ã¤ã³ããã¢ããªã±ã¼ã·ã§ã³ãèµ·åããå ´åã¯ã対話åã³ã³ã½ã¼ã«ãå ¥åãã¾ããRuby ã§ã¯ã³ã¼ãã¯è¡åä½ã§å®è¡ããããããå¦ç¿ããããã°ãç°¡åã§ããã¾ããçãã³ãã³ããå®è¡ãã¦æ¥å¸¸ã®åé¡ã解決ãããã¨ãã§ãã¾ãããã¡ã¤ã«åããã©ã¡ã¼ã¿ã¨ãã¦æå®ããå ´åã¯ããã¡ã¤ã«ãå®è¡ãããçµæãã³ã³ã½ã¼ã«ã«åºåããã¾ãã
ä»å¾ã®äºå®
次åã®è¨äºã§ã¯ãåãå ¥ããã¹ãã®æ¦å¿µã¨ãåãå ¥ããã¹ããæ´»ç¨ãã¦é¡§å®¢ã¨éçºè ã®ææçéãæ¹åããæ¹æ³ã«ã¤ãã¦èª¬æãã¾ããã¾ããIronRuby 㨠RSpec ã使ç¨ãã¦åãå ¥ããã¹ããèªååãã.NET ã¢ããªã±ã¼ã·ã§ã³ãæ¤è¨¼ããæ¹æ³ã¨ãã·ã¹ãã ã®å®è¡å¯è½ãªä»æ§ãä½æããæ¹æ³ãç´¹ä»ãã¾ãã
Ben Hall ã¯ãã³ã¼ãã®è¨è¿°ãæããã½ããã¦ã§ã¢éçºã«ä¸¦ã ãªãã¬æ ç±ãæ±ãã¦ãã C# éçºè /ãã¹ã¿ã§ããè±å½ã® Red Gate Software 社ã«ãã¹ã ã¨ã³ã¸ãã¢ã¨ãã¦å¤åããæåãèªåãåãããã½ããã¦ã§ã¢ ãã¹ãã®ãã¾ãã¾ãªææ³ã模索ãã¦ãã¾ããç¹ã«åãå ¥ãã¦ããã®ã¯ã種é¡ã®ç°ãªãã¢ããªã±ã¼ã·ã§ã³ã®æé©ãªãã¹ãææ³ã®ç 究ã§ããBen 㯠C# MVP ã§ããå½¼ã®ããã°ã¯ Blog.BenHall.me.uk ã§èªããã¨ãã§ãã¾ãã