我们已经学了几种不同种类的对象(数字和字母),还学了指向它们的变量;下一步我们想做的就是把它们“和谐相处”起来。
我们已经知道如果想让程序输出
25
,下面的代码不会成功运行,因为数字和字符串不能相加:
var1 = 2
var2 = '5'
puts var1 + var2
部分原因是电脑不清楚你是想得到7
(2+5),还是你想得到25
('2'+'5').
在我们能够把他们加到一起前,我们需要某种方法来提取到var1
的字符串格式和var2
的数字格式.
类型转换
想要得到一个对象的字符串格式,我们只需在其后加上.to_s
:
类似的,使用 to_i 会得到一个对象的整数格式,to_f 会得到浮点格式。下面让我们更进一步来看看用这三种方式会得到什么:
注意到:即使在我们通过调用 to_s 得到
var1
的字符串格式后,var1
总是指向 2,而不会指向 ‘2’。除非我们明确得再将var1
重赋值(需用到 = 符号),var1
至始至终都只会指向 2.
下面让我们来看一个更有趣(且有点怪异)的转换:
puts '15'.to_f
puts '99.999'.to_f
puts '99.999'.to_i
puts ''
puts '5 is my favorite number!'.to_i
puts 'Who asked you about 5 or whatever?'.to_i
puts 'Your momma did.'.to_f
puts ''
puts 'stringy'.to_s
puts 3.to_i
输出结果可能有些让人吃惊。第一个输出是标准的,会得到浮点数
15.0
,之后我们将字符串‘99.999’转换为浮点和整数:浮点转换如我们期待的那样,而整数转换通常是向下舍去。
之后我们用几个不寻常的字符串进行数字转换。to_i 会忽视它遇到没法转换整数的第一个及之后的所有内容,因此第一个例子会转换成 5
,另一个例子中由于是用字母开头,to_i 会直接忽视,所以计算机只得到了0.
最后面的两个转换什么也没做,正如我们期待的那样。
细看puts
细看转换操作有些奇怪…比如下面的例子:
puts 20
puts 20.to_s
puts '20'
20
20
20
这三个输出为什么都一样呢?好吧,后两个应该是一样的(20.to_s就是 ‘20’),但第一个整数20呢?如果这样在纸上写出整数20是表示什么呢?你先写一个 2 然后再写一个 0 ,实际上你写出的是一个字符串,而不是数字。数字20是我手指头和脚趾头的总数,而不是 2 后面加个 0.
好吧,在我们友好的朋友puts
后面隐藏着一个大秘密:在puts
输出一个对象之前,它会用 to_s来获取对象的字符串格式。事实上puts
中的 s 就是string的简写,puts
实际上就表示 put string.
现在来看的话就没什么太惊喜的了,但是在Ruby中有许多许多种类的对象(你以后会学到如何自己创建一个对象!),所以当你试着输出一个奇特的对象时你最好知道将会发生什么,这个对象可以是你祖母的照片,也可以是一个音乐或其他的,这些之后都将会遇到。
与此同时,我们还有几种其他的方式,这几种方式将会让我们写出多种多样有趣的程序…
gets 和 chomp
如果puts
表示 put strings ,我想你肯定能猜到gets
是什么的简写。就像puts
总是输出字符串一样,gets
将仅仅取回字符串,但它会从哪得到字符串呢?
是从你那得到的!好吧,最终是从你的键盘上获取的。那是因为你的键盘只会输入字符串,这就相互配合得很完美了。实际上gets
所做的仅仅是读取你键入的数据直到你回车(Enter),让我们试试下面的:
puts gets
当然,不论你键入的是什么内容,
gets
只会重复并回应给你。你可以试着键入其他内容,自己试验几次。
到现在我们能够和程序进行交互了!下面的例子你可以键入你的名字,程序会向你打招呼的:
puts 'Hello there, and what\'s your name?'
name = gets
puts 'Your name is ' + name + '? What a lovely name!'
puts 'Pleased to meet you, ' + name + '. :)'
咦!我刚刚运行了这个程序--我输入了我的名字,下面是输出的:
嗯……看起来是因为当我输入C,h,r,i,s,之后我敲了回车键,
gets
获取到了我名字含有的所有字母和Enter 键!幸运的是,有解决这个问题的方法:chomp. 它将去除字符串结尾的任何Enter键。让我们在试试这个程序,这次用上chomp
来帮助我们:
puts 'Hello there, and what\'s your name?'
name = gets.chomp
puts 'Your name is ' + name + '? What a lovely name!'
puts 'Pleased to meet you, ' + name + '. :)'
完美运行!不过需要注意到
name
是指向了 gets.chomp
,我们不需要说name.chomp
,name
本身就已经被除去Enter了(chomped)!
牛刀小试
- 写一个问某人的First name,然后middle name,然后last name的程序,最终程序应该用他的全名来向这个人打招呼。
- 写一个问某人幸运数字的程序,然后在幸运数字上+1,然后建议某人把最新的数字做为更大更好的幸运数字(尽管你需要讲究点策略)
当你做完这两个训练后(再加上你自己想试验的程序),接下来让我们学点其他的。
参考:
**First+Mid+Last**
**Favorite No.**
网友评论