`
javasee
  • 浏览: 960765 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

"Ruby".say_hello

阅读更多
(本文系笔者为《Programming Ruby》第二版所作的推荐序。)
<meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE"> <meta content="OpenOffice.org 2.0 (Linux)" name="GENERATOR"> <meta content="Jeff Xiong" name="AUTHOR"> <meta content="20061216;13135200" name="CREATED"> <meta content="Jeff Xiong" name="CHANGEDBY"> <meta content="20061216;16493800" name="CHANGED"> <style type="text/css"> <!-- @page { size: 8.5in 11in; margin: 0.79in } P { margin-bottom: 0.08in } H1 { margin-bottom: 0.08in } H1.western { font-family: "AR PL ShanHeiSun Uni", sans-serif; font-size: 16pt } H1.cjk { font-family: "AR PL ShanHeiSun Uni"; font-size: 16pt } H1.ctl { font-family: "Lucidasans"; font-size: 16pt } --> </style>

"Ruby".say_hello

根据我的观察,习惯于Java或者C#的程序员在初初接触Ruby时,最能打动他们的往往就是像本文标题这样的一句代码:原本熟悉的字符串或者整数突然摇身一变,有了很多新的行为,甚至让整个Ruby语言都似乎变了个样。尽管“改变标准库的行为”并不总是值得推荐的做法,但如果使用得当,你能够在Ruby的基础上创造出一种贴近项目需求、易写易读的方言——也有人把这些方言叫做“领域专用语言”(DSL,Domain Specific Language)。更多的程序员是因为Rails这个框架才开始对Ruby语言产生兴趣,而Rails在很大程度上正是一种针对Web应用开发的DSL。

能够创造DSL,这是Ruby语言最大的魅力之一。但仅仅这一点并不足以解释为何有那么多优秀的程序员如此盛赞Ruby语言,更不足以解释为何它会突然间红透半边天——毕竟,在元编程方面更具实力的LISP和Smalltalk并没有像如今的Ruby这样流行。作为一个Java程序员的Mike Clark给了我们一个有趣的比喻:推绳子——他说“读了仅仅几页 Programming Ruby之后,再使用Ruby之外的语言编程感觉就像是在‘推绳子’(push rope)。”把一根软绵绵的绳子往前推,那种有劲使不上的感觉,正是用惯Ruby之后再回到Java/C#时的真实感受。

灵活、优雅、巧妙、便利……这些溢美之辞我们已经听得太多了。但在我看来,Ruby最大的特点就一个字:快。这不仅意味着你能够很快地为自己的问题找到现成的解决办法,更意味着你能够直观地描述自己心中的想法,并且在改变想法时能够很快地调整你的程序。这种能力对于今天的软件开发者而言显得尤为重要,因为世界在飞快地改变,软件项目的需求在飞快地改变。对于今天的软件客户来说,尽快得到可以工作的软件、尽快反馈、尽快看到调整的效果,比一个完美但尚未实现的设计要有价值得多。而Ruby这种“快速实现想法”的能力,正是众多开发者对之青睐有加的根源所在。

Ruby能够帮你描述心中所想——这句话,在某种意义上,也意味着你需要熟悉Ruby的思考方式。尽管自称是面向对象的脚本语言,Ruby的精神仍然与函数式编程(functional programming)一脉相承。这种精神不仅体现在语法层面上,还体现在构建系统的思路上。Ruby社群很少会一开始就把要实现的目标想得清清楚楚、或是首先制定种种规范标准,相反,他们会充分利用Ruby的灵活与简洁、优雅与巧妙,从一个简单的、能够工作的软件开始,逐步增加更多的功能,并通过不断重构和优化让良好的设计逐渐浮现。

是以,跨进Ruby的世界,也许你首先需要学会的是这种“渐进式”的思维方式——不仅仅是编写软件,就连“学习Ruby语言”本身也是一样。你不需要读18本书或者参加半年培训来学会Ruby编程——另一方面即便你这么做了也未必就能学会,如果你没有使用Ruby来编写真正有用的程序的话。所以,如果你对Ruby产生了兴趣,稍微了解一下,然后就开始写吧:把编写shell脚本的首选语言从Perl改为Ruby,用Rake来构建你的项目,或者——像大多数人那样——用Rails来开发一个小网站。你会遇到无数的问题,解决这些问题的过程就是对你的技术进行重构的过程。

但你至少还需要通过某种途径来“稍微了解”Ruby语言,而且在遇到问题时也需要一本手册来帮你排疑解难。在你手上的这本《Programming Ruby》正是为此而生的一本书。书中的精彩内容无须我在这里赘述,你大可以自己去发掘。我唯一想要告诉你的是:如果你想要开采最瑰丽的“红宝石”宝藏,这本书就是你不可或缺的“镐头”。锻造这柄镐头的是两位大名鼎鼎的“实用主义程序员”Dave Thomas和Andy Hunt,这两位撰写过一系列C++/Java/.NET技术图书的开发者最终选择用Ruby on Rails来开发他们自己的网站(PragmaticProgrammer.com),这本身就已经证明了Ruby的价值,同时也让我们对这本书的实用性更有信心。

所以,你还在犹豫什么呢?既然已经拿起了这本书,既然已经对Ruby产生了兴趣,就不要再浪费时间了。翻开书,跟着这两位讲求实效的作者一道,现在就开始你的Ruby编程之旅吧。Ruby已经向你说过“hello”了,你将会如何回应它呢?

最后,和以往一样,祝你在Ruby的世界里,编程快乐!

熊节

ThoughtWorks咨询师

2006年12月16日

西安

分享到:
评论

相关推荐

    Ruby_On_Rails笔记

    例如,与HelloWorldController相关联的视图文件是say.rhtml,位于app/views/hello_world目录下。在视图文件中,我们可以使用Ruby代码来动态生成HTML内容。在Rails中,视图文件通常与相应的控制器和动作相对应,形成...

    prototype_oop_javascript_ruby_prototype_

    person1.say_hello # 输出 "Hello, Alice" ``` 尽管JavaScript和Ruby在实现OOP上有显著的区别,但它们都允许对象之间共享属性和方法,以提高代码的复用性和灵活性。理解这两种语言的原型和类概念对于跨语言开发和...

    Ruby语言入门教程&代码示例.pdf

    def say_hello(name) puts "Hello, #{name}!" end ``` **4. 类和对象** - **定义类**: 使用`class`关键字。 - 示例: ```ruby class Person attr_accessor :name, :age def initialize(name, age) @...

    写公共函数文件,要使用到类,将类传参进来.rb

    在这个例子中,`extend_class`函数接收一个类`klass`作为参数,并通过`class_eval`方法向这个类添加了一个新的实例方法`say_hello`。这样,我们就可以在任何使用了`UtilityModule`的类中为它们动态添加功能。 此外...

    编程之魂:Ruby中的元编程艺术

    person.say_hello # 输出: Hello! ``` ### 元数据的使用 Ruby 提供了 `method_missing` 方法来捕获对不存在方法的调用,这对于实现动态行为非常有用。当尝试调用一个未定义的方法时,`method_missing` 将会被触发...

    Ruby语言入门教程&代码示例.zip

    person.say_hello ``` 2. 继承:Ruby支持类间的继承,子类可以继承父类的属性和方法。例如: ```ruby class Student def study puts "#{@name} is studying." end end student = Student.new("Bob", 18) ...

    Ruby Notes For Professionals RubyNotesForProfessionals.pdf

    - **示例**: 创建一个名为`hello.rb`的文件,并加入以下内容: ```ruby #!/usr/bin/env ruby puts "Hello World" ``` - **执行**: 给文件添加执行权限并运行。 ```bash chmod +x hello.rb ./hello.rb ``` #...

    Ruby_on_Rails笔记

    ### Ruby on Rails 笔记知识点总结 #### 一、引言 在《Ruby on Rails笔记》中,作者陈刚分享了他在学习Ruby on Rails过程中的经验与心得。这份笔记不仅包含了作者的学习历程和个人体会,还汇集了他在学习过程中遇到...

    ruby介绍及相应的ruby demo示意源码,供大家参考学习

    def say_hello puts "Hello, my name is #{@name}." end end person = Person.new("Alice") person.say_hello ``` 3. `array_operations.rb`:演示了Ruby数组的操作,如遍历、添加元素等。 ```ruby arr = [1, 2...

    say-hello-ruby-prework

    问好 ... 该方法还有另外一件事:如果您调用此方法而忘记给它指定一个人的名字,它应该只说"Hello Ruby Programmer!" 。 使用默认参数完成此操作! 脚步 运行learn以了解自己的立场。 您可能有两个No

    二十分钟Ruby入门教程

    Ruby有几种基本的数据类型,包括整数(如`5`)、浮点数(如`3.14`)、字符串(用引号括起来,如`"Hello"`,支持单引号和双引号两种)、布尔值(`true`或`false`)以及符号(以冒号开头,如`:symbol`)。另外,数组和...

    ruby 一些简单的例子介绍和代码操作

    person.say_hello # 输出:Hello, I'm Alice, and I'm 25 years old. ``` Ruby还支持模块(module),用于封装代码和实现多重继承。例如: ```ruby module Greeter def greet puts "Welcome!" end end class ...

    say-hello-ruby-001-prework-web

    问好 ... 该方法还有另外一件事:如果您调用此方法而忘记给它指定一个人的名字,它应该只说"Hello Ruby Programmer!" 。 使用默认参数完成此操作! 脚步 运行learn以了解自己的立场。 您可能有两个N

    say-hello-ruby-online-web-prework

    问好目标通过使用默认...该方法还有另外一件事:如果您调用此方法而忘记给它指定一个人的名字,它应该只说"Hello Ruby Programmer!" 。使用默认参数完成此操作!脚步运行learn以了解自己的立场。您可能有两个NoMetho

    Ruby程序设计(简洁清新的教程)

    person.say_hello ``` **3.3 继承** Ruby支持单一继承: ```ruby class Student def initialize(name, age, grade) super(name, age) @grade = grade end def study puts "Studying hard in grade #{@...

    say-hello-ruby-online-web-sp-000

    问好目标通过使用默认...该方法还有另外一件事:如果您调用此方法而忘记给它指定一个人的名字,它应该只说"Hello Ruby Programmer!" 。使用默认参数完成此操作!脚步运行learn以了解自己的立场。您可能有两个NoMetho

    模块的力量:Ruby中include与extend的深度解析

    person.say_hello("Alice") # 输出: Hello, Alice! ``` 在这个例子中,`Greeter`模块定义了一个名为`say_hello`的方法,该方法通过`include`被混入到了`Person`类中。因此,`Person`类的实例可以直接调用`say_hello...

    ruby语法

    def say_hello(name) puts "Hello, #{name}" end ``` 4. **控制结构**: Ruby有标准的控制结构,如条件语句(`if`、`unless`)、循环(`for`、`while`、`until`、`each`)和开关语句(`case`)。 5. **块与迭代...

    RUBY基础入门指南

    person.say_hello # 输出 "Hello, my name is Alice and I am 25 years old." ``` **3.3 继承** 子类可以继承父类的所有公共方法和属性: ```ruby class Student def study(subject) puts "#{@name} is ...

Global site tag (gtag.js) - Google Analytics