我想读《Best of Ruby Quiz》并实践里面的内容是熟悉ruby的一个好方法,那么让我从今天开始,每天都用ruby来quiz一下。    
        几点说明:1、我是ruby新手,一开始要从看人家的答案开始,不一定能够提供自己的解决方案,而且我写的有些东西可能是很粗浅的,也请大家不要见笑;2、笔记里面的问题都是我自己不明白的地方,希望并欢迎与大家交流;3、我的笔记主要针对书上给出的标准答案。
       
       闲言少叙,下面开始Quiz 1: Mad Libs
 
关键字:字符串 erb 模板处理 正则表达式
      
        这个quiz的意图应该是读取一个文件中的文本(说明:下列文本中的下划线和颜色都是我自己加的,是为了看起来清晰),例如:
I ((a verb, past tense)) to the sandwich shop across the street for lunch yesterday. I go there at least ((a number)) times a week.
将这段文本读出后,针对每对(())中的内容,提问,并获取用户输入,例如针对((a number)),提问“Give me a number ” ,并接受用户的输入,进行替换。处理完成后,上面的文本应该变为:
I walked to the sandwich shop across the street for lunch yesterday. I go there at least 9 times a week.

1、书中给出的解决方案是要使用Ruby的内建类库"erb",erb是一个进行类似于模板处理功能的类库。可以执行一段文本中用<%%>包起来或者是以%开头的Ruby代码。
require 'erb'
str = %{\
% 2.times do |i|
 This is line <%= i %>
%end
%% done}
ERB.new(str, 0, '%').run

运行结果是:
 This is line 0
 This is line 1
% done
2、$answers = Hash.new
这一句里面的$表示一个全局变量的标识。
看了Ruby这些日子,我觉得这门语言最繁琐的就是使用了那么多的符号,并且互相之间产生了那么多的组合,对于初学者来说,记录和使用他们,是要付出很大努力的。而且我觉得在敲入代码的时候,这么多符号也很麻烦。比如这个$,就是其中之一。
3、$answers[question]
answers是一个Hash,这样的调用方式,表示引用answers这个Hash中以question为key的对应的value
4、key = if question.sub!(/^\s*(.+?)\s*:\s*/, "") then $1 else nil end
上面的代码有两个目的,
 第一,将(.+?)中匹配得到的值赋予key;
 第二,对question字符串进行处理,去除掉第一个冒号之后的空格和冒号以及之前的字符
 例如:假定question = " a : b : c ",经过上述语句处理后,key = "a", 而question = "b : c "
5、unless ARGV.size == 1 and test(?e, ARGV[0])
● ARGV是一个包含命令行参数的数组。ARGV[0]是程序的第一个参数而不是程序名称。当前程序的名称位于全局变量$0中。
● test(?e, ARGV[0])
test test(cmd, file1 <, file2>)->obj
使用数值cmd在file1或file1和file2上执行各种测试。cmd为?e,表示如果file1存在,则为true。因此,上面的语句的含义为:
“除非只有一个命令行参数,并且存在该参数表示的文件,否则:”执行后面的语句
6、madlib = "\n#{File.basename(ARGV.first, '.madlib' ).tr('_' , ' ' )}\n\n" + File.read(ARGV.first)
● File.basename
File.basename(filename<, suffix>) -> string
返回给定文件名filename的最后一部分。如果有suffix参数,且它出现在filename的末位,则它将被删除。通过使用".*"可以去除任意扩展名。
File.basename("/home/gumby/work/ruby.rb")  -> "ruby.rb"
File.basename("/home/gumby/work/ruby.rb", ".*")  -> "ruby"
●ARGV.first
arr.first ->obj 或nil
arr.first(count) ->an_array
返回数组的第一个元素,或前count个元素。如果数组为空,第一种形式返回nil,而第二种形式返回一个空数组。
● tr(' _', ' ')
tr str.tr(from_string, to_string) ->string
返回str的一个拷贝,用to_string的相应字符替换from_string的字符。如果to_string的长度比from_string短,就会用to_string的最后一个字符来填充。这两个字符串可能都使用c1-c2表示法来表示字符的区间,同时from_string可能以一个^字符开始,表示除了这些给定字符之外的所有字符。
"hello".tr('aeiou', '*')   ->"h*ll*"
"hello".tr('^aeiou', '*')   ->"*e**o"
"hello".tr('el', 'ip')   ->"hippo"
"hello".tr('a-y', 'b-z')   ->"ifmmp"
综上,我认为上面这句的作用应该是将后缀为madlib的文件的文件名和文件的内容统一放在一个大字符串内
====================================================================================
上述6点,是我针对书上提供的标准解决方案的问题笔记。欢迎大家一起进行探讨。
MadLib标准解决方案

转载于:https://www.cnblogs.com/bryanzk/archive/2007/07/17/820047.html

Best of Ruby Quiz 笔记之一:Mad Libs相关推荐

  1. Ruby学习笔记_索引贴

    学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友. ...

  2. ruby学习笔记(11)--symbol与hash参数

    symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001&qu ...

  3. ruby学习笔记(2)-chomp,chop的区别

    还没开始系统性的学习Ruby,最近在看metasploit框架的exploit会涉及到Ruby脚本,也就硬着头皮一遍查阅资料一遍做些笔记吧. Ruby字符串中存在chop和chomp的内置函数.我在h ...

  4. Programming Ruby学习笔记一

    最近在学习Programming Ruby,做点读书笔记来记录下自己的成长也是不错的.当然更希望的是各位大牛能指出本人的不足,在这里先谢谢大家了. 第一章     入门 讲的是如何安装Ruby,在Ru ...

  5. Ruby 学习笔记3

    在Ruby中有很多方法是以?和!号结尾的 "?"被用于标示谓词,即返回Boolean直的方法,如Array.empty?(判断数组中元素是否为空) "!"出现在 ...

  6. 【ruby】ruby学习笔记之--环境搭建

    1.安装ruby环境 这里以windows为例,ruby可以安装在Linux中,首先.先到ruby的官网下载https://rubyinstaller.org/downloads/最新的ruby环境, ...

  7. Ruby学习笔记-循环与选择结构

     一.循环结构 1.    for-in语句: Ruby提供的for...in语句主要用于迭代数组和Hash对象中的元素,与其它语言的for 语句有一定的差距,语法格式: for val  in  ...

  8. ruby学习笔记(3)--语法层面的先见之明

    看了几天ruby,发现c#中很多一直被称道的语法特性,ruby早在几年前就有了: 1.c#中的params关键字 class Program{static void Main(string[] arg ...

  9. Ruby 学习笔记6

    引用自 http://ruby-china.org/topics/10414 做为热身,从一些简单的例子开始, def f1yield enddef f2(&p) p.call end def ...

最新文章

  1. 整个领域没了!学术界有史以来最大的丑闻
  2. 控制客户端对同一个服务端地址的连接端口数量
  3. GDI+ 学习记录(10): 线性渐变画刷 - LinearGradientBrush
  4. 【渝粤教育】国家开放大学2018年春季 0529-21T高级英语阅读(1) 参考试题
  5. mysql数学函数名_MYSQL 常见数学函数说明
  6. STL中 set 和 multiset
  7. ActiveMQ学习总结(9)——Linux中安装ActiveMQ
  8. 沙盘正在注销进程start_电脑关不了机,一直处于正在注销,这是为什么
  9. 性能测试oracle瓶颈定位,性能测试难点之瓶颈分析
  10. RFID天线—1.阻抗测量方法
  11. 小白学python——程序结构
  12. 【AnySDK】接入必读及常见问题
  13. Exp5 MSF基础应用 20164323段钊阳
  14. [杂言] 祭奠与真正的告别
  15. 计算机主机机箱背后,2.8L的办公电脑?可以背在显示器后面的主机—你见过吗?...
  16. java优化编程 第2版_Java优化编程(第2版)林胜利、王坤茹 pdf
  17. PCL:StatisticalOutlierRemoval 统计滤波
  18. PHP_CodeSniffer 的代码静态分析
  19. 挡土墙lisp程序_挡土墙设计程序说明
  20. OSChina 周一乱弹 ——周末就在家改Bug么

热门文章

  1. python之开发系列
  2. java 高级数据类型_【高级数据类型】- 2.通道的更多种类
  3. bootstrap table传回的数据后端怎么获取_Flasksqlalchemy让你的数据库和网页执手偕老吧...
  4. 简单介绍redis分布式锁解决表单重复提交的问题
  5. 简述安装Tsurugi Linux发行版
  6. java隐藏控件_Android控件的显示和隐藏
  7. poj3122(二分算法)
  8. 关于Java中的JDBC使用和数据库(SQL Server)连接之后的一些操作
  9. 物理学在计算机领域的应用,物理学在计算机中的应用.doc
  10. 【牛客每日一题】 4.13 Xorto(前缀异或和,枚举优化/映射)