ruby学习笔记(3)--语法层面的先见之明

看了几天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 = 0
	num.each { |i| numSum+=i }
	return numSum
end

puts sum()
puts sum(3,6)

2.c#中的缺省参数(据说从4.0才开始支持,但ruby早就有了)

def  sum( a, b=5 )
  a+b
end
puts 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)
end

helloWorld = 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 Array
	def NewMethod
		for i in 0...size
			yield(self[i])
		end
	end
end

arr = [1,2,3,4,5]

arr.NewMethod{|x| print x ,"\n"};

puts "*******************************"
arr.NewMethod{|x| print x * x ,"\n"};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

Silverlight中的序列化

序列化简言之是这样一种能力:能够把复杂的对象(Object)变成某种格式的字符串(常见的格式有xml,string,二进制文件等),这样可以方便的在各种系统中传...

1965
来自专栏前端侠2.0

学习表达式树笔记 原

文章地址:  http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html

1002
来自专栏菩提树下的杨过

数据结构C#版笔记--队列(Quene)

队列(Quene)的特征就是“先进先出”,队列把所有操作限制在"只能在线性结构的两端"进行,更具体一点:添加元素必须在线性表尾部进行,而删除元素只能在线性表头部...

2085
来自专栏哲学驱动设计

lambda表达式-编译测试

我不会IL,也不想学IL,所以为了测试Lambda表达式编译的原理,只能使用调试进行试验来认识: 第一种情况,当Lambda表达式没有用到函数外的变量时: cl...

2217
来自专栏cnblogs

async 和 await 之异步编程的学习

      async修改一个方法,表示其为异步方法。而await表示等待一个异步任务的执行。js方面,在es7中开始得以支持;而.net在c#5.0开始支持。...

2038
来自专栏大内老A

我的WCF之旅(4):WCF中的序列化[下篇]

XMLSerializer 提到XMLSerializer,我想绝大多数人都知道这是asmx采用的Serializer。首先我们还是来看一个例子,通过比较Ma...

21710
来自专栏跟着阿笨一起玩NET

用于查询的日期类型转换帮助类

本文转载:http://www.cnblogs.com/iamlilinfeng/p/3378659.html

832
来自专栏林德熙的博客

C# 复制列表

List<Fex> b = a.ToList(); 可以把列表a到列表b,对b进行删除、添加,不会对a造成元素改变。

1341
来自专栏跟着阿笨一起玩NET

C#如何把List of Object转换成List of T具体类型

上周码程序的时候碰到个问题,因为设计上的约束,一个方法接受的参数只能为List<object>类型,然而该方法需要处理的真实数据则是确定的List<Curren...

2991
来自专栏跟着阿笨一起玩NET

C# 常用日期类型转换帮助类

本文转载:http://www.cnblogs.com/iamlilinfeng/p/3378659.html

2862

扫码关注云+社区

领取腾讯云代金券