4 大三元

我们已经学了几种不同种类的对象(数字字母),还学了指向它们的变量;下一步我们想做的就是把它们“和谐相处”起来。

**Tristar**

我们已经知道如果想让程序输出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.**
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 3,202评论 0 6
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,752评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 本周小结 本周实验室的状态呢周一:解决重构项目的mapping方面的细节问题。完成了软著代码文档的初版整理,已经到...
    im天行阅读 183评论 0 0
  • 感恩自己,比平日连续早起了3天,今天微微小雨,没有出门跑步,在家做一些简单的伸展运动。 给自己准备一份简单的早餐,...
    Flytty阅读 110评论 0 0