技术开发 频道

没有Rails Java程序员如何使用Ruby


四、在Ruby中定义类

在列表3中,你可以看见以Ruby定义的两个相同的类;然而,列表3看上去与上面相当不同,对不对?

列表3.用Ruby定义的两个与前面功能相同的类

            

module Dictionary

class Word

 attr_reader :spelling, :part_of_speech, :definitions, :synonyms

 attr_writer :spelling, :part_of_speech

 def initialize(spelling, part_of_speech, definitions = [], synonyms = [])

 @spelling = spelling

 @part_of_speech = part_of_speech

 definitions.each{ |idef| idef.word = self}

 @definitions = definitions

 @synonyms = synonyms

end

def add_definition(definition)

 definition.word = self if definition.word != self

 @definitions << definition

end

def add_synonym(synonym)

 @synonyms << synonym

end

end

class Definition

 attr_reader :definition, :word, :example_sentences

 attr_writer :definition, :word

 def initialize(definition, word = nil, example_sentences = [])

 @definition = definition

 @word = word

 @example_sentences = example_sentences

end

end

end

如果说列表3中有一件事情值得你注意的话,那就是,Ruby的语法相当简练。但是,别让它的简练愚弄了你-在这些代码中存在很多内容!首先,两个类都被定义在一个模块中。实质上,模块相当于Java语言的一个包。而且,在Java语言中,我可以据需要把这些类在多个文件中定义。你还要注意,Ruby中的类构造器被命名为initialize,而在Java语言中,构造器是使用类名命名的。

五、快速移动对象

在Ruby中,创建对象实例的方法与Java不同。不是使用Java中的“new ObjectInstance()”语法,而是,Ruby支持在一个对象上调用一个新方法,实际上是在内部调用了initialize方法。在列表4中,你可以看到我是怎样用Ruby创建一个Word实例及一些相应的Definition的:

列表4.在Ruby中创建一个新对象实例

            

require "dictionary"

happy_wrd = Dictionary::Word.new("ebullient", "adjective")

defin_one = Dictionary::Definition.new("Overflowing with enthusiasm")

defin_two = Dictionary::Definition.new("Boiling up or over")

happy_wrd.add_definition(defin_one)

happy_wrd.add_definition(defin_two)

在列表4中,我使用Ruby的require方法(你可以在Kernel类中找到它)导入了dictionary模块。然后,它使用“Object.new”语法创建Word的一个新实例(ebullient)。尽管我导入了dictionary模块,但是我仍然需要限定对象实例,因此我们使用了"Dictionary::Word"限定符。

六、默认参数值

你是否注意到,在列表4中,当我创建happy_wrd实例时,我并没有一个definition或synonym的集合。我仅传递了拼写和语法成份。因为Ruby支持参数默认值,所以我成功地进行了省略。在列表3中定义的Word的initialize方法中,我指定了定义“=[]”和同义词“=[]”作为参数,这也就是向Ruby指出,如果它们不被调用者包括在内,那么将把它们默认地指定为空集合。

还要注意,在列表3中,Definition的initialize方法是如何支持默认参数的-通过把example_sentences设置为一个空集(Ruby的nil相应于Java中的null)来实现。在前面的列表1中,我必须用Java语言创建三个构造器才能取得与此相同的灵活性!

现在,请注意,在列表5中,通过使用灵活的initialize()方法我创建了一个不同的Word实例。

列表5.Ruby的灵活性!

            

require "dictionary"

defin = Dictionary::Definition.new("Skill in or performance of tricks")

defin_two = Dictionary::Definition.new("sleight of hand")

defs = [defin, defin_two]

tricky_wrd = Dictionary::Word.new("prestidigitation", "noun", defs)

在我定义了两个Definition以后,我把它们添加到一个集合(在Java语言中,就象一个数组)。然后,我把该集合传递给Word的initialize()方法。

七、集合运算

Ruby的集合运算能力也相当简单-你是否看到在Word类中的add_definition和add_synonym方法?语法的重载意味着可以对集合进行加法运算。如果你看一下前面的列表2中的Definition类,你就会看到Java语言的相应代码更为复杂些:

            

this.exampleSentences.add(exampleSentence)

Ruby的集合运算极其简明。在列表6中,你可以看到合并集合(使用+操作符)和存取成员(经由[position])是多么容易,这样做你不需要担心任何事情。

列表6.快速的集合运算

            

require "dictionary"

idef_1 = Dictionary::Definition.new("Sad and lonely because deserted")

idef_2 = Dictionary::Definition.new("Bereft; forsaken")

defs = [idef_1, idef_2]

idef_3 = Dictionary::Definition.new("Wretched in appearance or condition")

idef_4 = Dictionary::Definition.new("Almost hopeless; desperate")

defs_2 = [idef_3, idef_4]

n_def = defs + defs_2 #n_def现在是[idef_1,idef_2,idef_3,idef_4]

n_def[1] #生成idef_2

n_def[9] #生成nil

n_def[1..2] #生成[idef_2,idef_3]

注意,列表6中的代码仅涉及到Ruby中集合运算的基本内容!

0
相关文章