[译林系列-ruby]通过IronRuby和C#学习Ruby[1]

在之前的文章中,我已经解释了如何获得IronRuby以及如何设置运行IR的问题。如果你还没有看过,快去看吧!

如果你同大部分的C# 程序员一样,你最近可能已经听过许多关于动态语言,比如Ruby和Python的消息。如果你作为一个web开发者,很可能你已经用动态语言进行过开发了。当然我指的是javascript。如果javascript是动态语言的话,你一定会认为动态语言没什么大不了的。正如同大多数的C#程序员而言,你并非一个javascript的fans。当然这是有很多原因的,但我认为最主要的还是因为浏览器平台的差异性以及程序语言范式和我们过去所知的截然不同造成的。

Ruby没有这些问题。它有着一个标准的实现,这是IronRuby的目标,同时它有着同C# 类似的面向对象的特点。在这个系列了,我想通过一些示例展现如何将你的C#技巧运用于Ruby中。同时我希望你了解到Ruby的强大以及你可以用Ruby干些什么。

要说明的是,我并非一个Ruby专家,我在此只是与你们分享我的学习经验。如果我有什么说的不对的或不清楚的,还请告知我,我会及时修正它们的。

在我们开始之前,我们先考虑一个问题什么是动态语言?动态语言是一种运行于解释环境之下,并在运行期间才去完成静态语言在编译期就能完成的工作。因此,程序能够很随意地进行改动。很多人认为这应该属于一种Metaprogramming(译者:元编程?)。如今,动态语言这个词汇会有一些模糊,但我认为你将会随着深入学习Ruby而理解它。

下面,让我们从基础开始介绍。没有什么比变量来的更容易了,在C#中一个本地变量被这样声明:

int count = 1;

注意,你要设定类型,名称,值,而在Ruby 中

count = 1

是的,正如你看到的,它并没有类型信息。这是因为Ruby是一种动态语言,而且拥有动态类型。这已为这任何类型都是隐性的。因此当我们把“1”赋值给“count ”它就是个数字,如果我们用"abc“赋值,它就是个字符串,就像这样:

count = 1

count = "abc"

这段代码在Ruby中是完全合法的。我们可以重新赋值已改变变量的类型。至于这是不是一个好的实现就是另一回事了。在C#中,一切都被要求封装于类中,但Ruby并不需要这样。因此,Ruby可以拥有全局变量,使得其他文件也能访问到它。就像这样:

$count = 1

美元符号表明这个变量是一个全局变量。Ruby遵循这样一个准则,利用前缀来作为访问修饰符。接下来的两个类型变量将会是我们要讨论的“类”,这里我会向你演示快捷的类声明,但首先我们看一下C# 下的声明:

public class Person

{

}

Ruby中是这样的:

class Person

end

C# 中我们能在class中声明两类变量, instance 和static. 正如你所知, instance 变量记录了类实例的一个唯一的值,而 static 变量则是一个对于所有示例保持同一值得变量。C#例子如下:

public class Person

{

protected int count;

protected static int count2;

}

在Ruby里:(注意: Ruby的static变量通常指 "class variables"):

class Person

@count

@@count

end

另一件你必须注意的事是Ruby的变量是无类型的恶。这是因为,Ruby 的类和实例变量按照设计就不允许外部类访问。我在C#中用了protected修饰符,因为ruby的实例变量可以被继承类访问,实际上ruby中根本没有私有的实例或者类变量。为了能让外部访问变量,你必须指定get,set函数来处理他们。可能现在你会发现这是多么的痛苦,让你不禁回想起了JAVA ~但没必要感到害怕,ruby提供了更为简便的方法来达到目的。就像C#3.0,我们最终有了那极棒的automatic properties:

public class Person

{

public int Count { get; set; }

public static int Count2 { get; set; }

}

Ruby提供了一个方法允许我们通过调用“attr_accessor"来定义属性,这个方法只对实例变量有效:

class Person

attr_accessor :count

@@count2 = 0

def count2

@@count2

end

def count2=(value)

@@count2 = value

end

end

好了,正如你所见我们已经定了一个访问我们静态变量的方法,但我们仅需一行代码来声明我们的实例变量和方法来访问变量。你也许会注意到一件事,attr_accessor后紧跟着count。这就是Ruby中所谓的Symbol. 它允许我们通过名称来进行扶着。在此例中,attr_accessor仅是简单的一个方法。在这个方法中我们我们用symbol的名称创建了一个实例变量,同时get和set方法也是用这个名称。这同样也可以通过传递一个string来实现,虽然比较低效。

今晚,我想就先写这么多。你应该已经知晓如何声明变量,类,类中变量。在下一篇中,我们将会充实我们的类并增加一系列数据操作。