© Shine's Blog

Powered by LOFTER

[Ruby 中文教程 By Chris Pine] 4.混合使用

翻译:阳光

原文来自 <https://pine.fm/LearnToProgram/?Chapter=04

 

4.混合使用

 

我们已经了解了不同类型的object(数字和字母),我们也学会了将它们赋值给变量,下面我们要试着将它们混在一起使用。

我们已经看到,如果想要一个程序输出25,像下面这么输入是没用的,因为你不能将数字与字符串相加:

var1 = 2

var2 = '5'

 

puts var1 + var2

 

这个问题一部分是因为你的计算机不知道你是要得到7(2+5)还是要得到25(‘2’+‘5’).

在我们将这些混合在一起之前,我们需要某种方式来用字符串表示var1,或者用整数来表示var2。

 

转换

 

要想用字符串来表示某个object,我们只需在它后面写上“.to_s”:

输入:

var1 = 2

var2 = '5'

 

puts var1.to_s +var2

输出;

25

 

类似的,to_i则会用整数来表示某个object,to_f则是用浮点。让我们再仔细看看这三种方法都能干什么(还有不能干什么):

输入:

var1 = 2

var2 = '5'

 

puts var1.to_s +var2

puts var1 +var2.to_i

输出:

25

7

注意一点,即使我们用to_s获得了var1的字符串版本,var1依然是指向数字2的,并没有变成'2'。除非我们明确地这样做了(需要一个=),它就会这辈子都指向数字2了。

现在让我们试一些更有趣的转换(有些有点奇怪):

输入:

puts '15'.to_f

puts '99.999'.to_f

puts '99.999'.to_i

puts ''

puts '5 is myfavorite number!'.to_i

puts 'Who asked youabout 5 or whatever?'.to_i

puts 'Your momadid.'.to_f

puts ''

puts 'stringy'.to_s

puts 3.to_i

输出:

15.0

99.999

99

 

5

0

0.0

 

stringy

3

所以,这可能看起来有点让人吃惊。开头的一个是很标准的,输出15.0。然后我们分别将字符串99.999转换成了一个浮点和一个整数。浮点的输出结果如我们所料,而整数如之前我们了解到的那样,总是向下找。

之后的几个,我们举了几个不太寻常的字符串来将它们转换成数字。to_i会从第一个它不识别的位置开始,放弃识别余下的字符串。所以第5行被转换成了数字5,但是其他由于开头是字母,所以被全部忽略了……所以计算机只输出了0。

最后,我们最后的两个转换什么也没有改变,这跟我们预期的一样。

 

puts的另一面

 

关于puts这个我们最爱的method,有一些奇怪的地方……看看这个:

输入:

puts 20

puts 20.to_s

puts '20'

输出:

20

20

20

为什么这三个全都输出了同样的东西:好吧,最后两个没问题,因为 20.to_s就是‘20’。但是第一个呢,那个整数20?对它来说,它是怎么知道要输出整数20的?当我们在一张纸上写了一个2然后又写了一个0时,你是写了一个字符串,不是一个整数。整数20是我手指跟脚趾加起来的个数,它不是一个2后面跟着一个0.

好吧,这是我们的好朋友puts背后的一个大秘密:它在输出任何内容之前,都会用一个to_s来得到那个内容的字符串版本。事实上,s代表着字符串,puts真的就输出了一个字符串。

现在这一点看起来也许不那么令人激动,但Ruby中有很多很多种object(你甚至将学会如何编写你自己的object!),如果能知道你输出一个非常奇怪的object时会发生什么是一件不错的事情,比如你祖母的照片,或者一个音乐文件,或者是其他的。但是那都是后话了……

与此同时,我们有一些新的method给你,它们能让我们写出各种各样的有趣的程序来……

 

gets 与 chomp

 

如果puts意味着输出字符串的话,我想你一定能猜到gets意味着什么。就像puts永远只输出字符串一样,gets永远只接收字符串。那么,gets是从哪得到那些字符串的呢?

从你那里!好吧,是从你的键盘那里,如果硬要追究的话。因为你的键盘智能产生字符串,它干这件事很在行。真相是gets就坐在那,看着你在按回车键之前都输入了什么东西。让我们试试吧:

输入:

puts gets

用户输入:

Is there an echo inhere?

输出:

Is there an echo inhere?

当然,你管你输入了什么,你只会得到重复的内容,多运行它几次,试试输入不同的内容。

现在我们可以编写交互程序了!现在,输入你的名字它就会赞赏你:

puts 'Hello there,and what\'s your name?'

name = gets

puts 'Your name is '+ name + '? What a lovely name!'

puts 'Pleased tomeet you, ' + name + '. :)'

奥!我刚才运行它了——我输入了我的名字,然后这是接下来发生的事情:

输出:

Hello there, andwhat's your name?

Chris

Your name is Chris

?  What a lovely name!

Pleased to meet you,Chris

.  :)

嗯...看起来当我输入C,h,r,i,s然后回车的时候,gets把我输的所有字母连同回车一起记录下来了!幸运的是,有一个叫chomp的method可以应对这种情况。它的作用就是去掉你字符串结尾的所有回车。让我们再试试,这次让chomp来帮助我们:

输入:

puts 'Hello there,and what\'s your name?'

name = gets.chomp

puts 'Your name is ' + name + '? What a lovely name!'

puts 'Pleased tomeet you, ' + name + '. :)'

输出:

Hello there, andwhat's your name?

Chris

Your name isChris?  What a lovely name!

Pleased to meet you,Chris.  :)

 

好多了!注意由于name是指向gets.chomp的,所以我们不必写name.chomp,那么已经被chomp处理过了。

 

一些练习

·写一个程序,问一个人的姓,然后问名,最后,它应该用完整的名字来恭维这个人。

·写一个程序,询问一个人最喜欢的数字。用你的程序把这个数字加上1,然后推荐这个新数字作为最喜欢的数字(但是要委婉一些哦)。

一旦你完成了这两个程序(如果有其他想试的,也去试试),就让我们学点新的method(也多了解一下method)。


发表于2014-07-07.