看了幾天ruby,發現c#中很多一直被稱道的文法特性,ruby早在幾年前就有了:
1.c#中的params關鍵字
class Program { static void Main(string[] args) { Console.WriteLine(Sum()); Console.WriteLine(Sum(3,6)); Console.Read(); } static int Sum(params int[] nums) { int _result = 0; foreach (int item in nums) { _result += item; } return _result; } }
對應的ruby版本:
def sum(*num)numSum = 0num.each { |i| numSum+=i }return numSumendputs sum()puts sum(3,6)
2.c#中的預設參數(據說從4.0才開始支援,但ruby早就有了)
def sum( a, b=5 ) a+bendputs sum(3,6)puts sum(3)
3.c#中的匿名方法
List<int> lst = new List<int>() { 1, 2, 3, 4, 5 };lst.ForEach((i) => { Console.WriteLine(i); });
ruby中的類似文法:
(1..5).each{|x| puts x}
4.c#中的delegate與action
class Program { static void Main(string[] args) { Action<string> a = new Action<string>(HelloWorld); a("jimmy"); Console.ReadKey(); } static void HelloWorld(string name) { Console.WriteLine("hello,{0}", name); } }
ruby中的類似文法:
def action(method,name) #相當於c#中的action聲明部分method.call(name)endhelloWorld = proc{|name| puts "hello,#{name}"} #被action調用的方法體action(helloWorld,"jimmy"); #通過action,調用helloWorld方法,輸出 hello,jimmy
5.c#中的擴充方法
class Program { static void Main(string[] args) { int[] arr = new int[] { 1, 2, 3, 4, 5 }; arr.NewMethod(); Console.ReadKey(); } } public static class ExtendUtils { public static void NewMethod(this Array arr) { foreach (var item in arr) { Console.WriteLine(item); } } }
ruby中的擴充方法更強大:
class Arraydef NewMethodfor i in 0...sizeyield(self[i])endendendarr = [1,2,3,4,5]arr.NewMethod{|x| print x ,"\n"};puts "*******************************"arr.NewMethod{|x| print x * x ,"\n"};