Welcome to Rainy's blog!

发布新日志

  • Ruby学习总结四

    2008-01-25 16:12:07

    总结四
    1. 使用’..’和’…’能生成范围对象,并且可以对范围内的元素进行操作。
    2. 两个点生成的范围对象包括终点,三个点生成的范围对象不包括终点。
    3. 1..100000就是一个范围对象的例子。
    4. .to_a方法能把范围对象转换成数组。
    5. 范围对象使用最多的就是判断某个值是否在某个范围内,使用’===’操作符。
    6. 范围的元素并不局限于数值,也可以是ruby对象。
    7. IMPORTANT:Block是括在大括号或者do-end中间的一组程序语句,和方法关联。
    8. Block的定义跟在方法名后面,如果方法带参数,那么Block的位置还要后移,要跟在最后一个参数后面。Block包含了一组程序语句,在定义时这些语句并不会执行,只有在方法中才能触发这些语句的执行。
    9. 当Block中包含单行语句时,使用大括号;如果包含多行语句,就要使用do-end。大括号的优先级比do-end要高。
    10. 在和Block关联的方法内,调用yield关键字会触发Block的执行,并且调用几次就会触发几次。
    11. yield可以传参数给Block,Block会接受这些参数并进行处理。接受的方式是使用"||"。
    12. Block不是对象,但是可以通过ruby内核的内置方法lambda把它转化成一个proc对象。
    13. 记住,不能把方法作为参数传给另一个方法,也不能把方法作为返回值。但是可以把Proc作为一个参数传给方法,或者从方法返回一个Proc类型的对象。
    14. Ruby中可以使用rand方法获得随机数。
    15. 默认情况下,rand方法得到一个大于或等于0.0,小于1.0的浮点数。如果给rand带一个整数的参数,比如rand(5),就会得到一个大于或等于0小于5的随机整数。
    16. File.open方法的几种读写模式:1.'r', read-only,只读模式,从文件头开始; 2.'r+',read/write,读写模式,从文件头开始; 3.'w',write-only,只写模式,覆盖原来文件或创建一个新文件。
    17. File.open后面跟的Block是对文件的操作,Block是可选的。如果不跟Block,File.open会打开一个新文件。如果跟了Block,文件会被作为参数传给Block进行处理,并且Block结束后,文件会被自动关闭。
    18. 注意:文件操作结束后,要Close文件,以防文件读写错误。
    19. seek也是IO类的方法,它会按着第二个参数的方法,从第一个参数给定的位置开始查找。 IO::SEEK_CUR - 从当前位置加上第一个参数的位置开始(第一个参数是相对位置)。 IO::SEEK_END - 从文件尾开始反向读取,位置是第一个参数的绝对值。IO::SEEK_SET - 从第一个参数给定的位置开始(绝对位置)。
  • Deaf Grandma Program

    2008-01-24 12:19:31

    Write a Deaf Grandma program. Whatever you say to grandma (whatever you type in), she should respond with HUH?! SPEAK UP, SONNY!, unless you shout it (type in all capitals). If you shout, she can hear you (or at least she thinks so) and yells back, NO, NOT SINCE 1938! To make your program really believable, have grandma shout a different year each time; maybe any year at random between 1930 and 1950. (This part is optional, and would be much easier if you read the section on Ruby's random number generator at the end of the methods chapter.) You can't stop talking to grandma until you shout BYE.
    Hint: Don't forget about chomp! 'BYE'with an Enter is not the same as 'BYE' without one!
    Hint 2: Try to think about what parts of your program should happen over and over again. All of those should be in your while loop.
    Here is a ruby program blow:
    word=nil
    while true
    print 'say something to the old woman:'
    STDOUT.flush
    word = gets.chomp
    if word == 'BYE' then
      exit
    end
    if word.upcase==word then
      puts "NO, NOT SINCE 19#{rand(30)+20}"
    else
      puts 'HUH?! SPEAK UP, SONNY!'
    end
    end
    Extend your Deaf Grandma program: What if grandma doesn't want you to leave? When you shout BYE, she could pretend not to hear you. Change your previous program so that you have to shout BYE three times in a row. Make sure to test your program: if you shout BYE three times, but not in a row, you should still be talking to grandma.
  • Ruby学习总结三

    2008-01-23 11:35:41

    总结三
    1. method_missing提供了一个友好的办法,处理找不到方法这种情况,代替了返回一个异常。
    2. 查找文档能得到详细的有关string的方法。
    3. 双引号括起来的字符串处理过程要复杂一些。它会处理转义字符和#{expression}中的表达式。
    4. 记住那些能列出类和对象的所有方法的方法。
    5. == 或者eql?比较的是两个字符串的内容,equal?比较两个字符串是否同一个对象。
    6. %w可以用来简化数组的初始化。
    7. 熟悉常用控制语句:if else end, while, if elsif end
    8. 另一个条件语句:unless end
    9. 多分支选择语句:case when else end。
    10. 数组是按顺序排列的对象,数组元素可以是同一类型,也可以是不同类型。定义数组使用方括号。
    11. 数组的索引都是整数,并且以0开始。
    12. 数组定义时,如果末尾有逗号,忽略它。
    13. 如果访问的数组元素越界,会返回nil。
    14. 可以动态的给数组添加元素。
    15. 查找相关文档获得更多数组信息。
    16. each方法能遍历数组中的所有元素,并且可以操作这些元素。
    17. 包含在'||'中的变量名称是任意的,代表的是数组中的每个元素。
    18. 遍历数组中的每一个元素时,都会运行do end程序块。

  • Ruby学习总结二

    2008-01-22 17:19:37

    总结二

    1. 尽量少使用全局变量,因为全局变量能在整个应用程序运行期生存,占用资源。全局变量以$开头。Ruby解释器在开始运行时,能自动初始化一定数目的内建全局变量。

    2. getschomp方法用来接收和处理用户输入。

    3. gets方法返回用户输入的字符串,并加上一个换行符, chomp方法删除字符串中的换行符。

    4. STDOUT是一个全局常量,代表的是标准输出流。flush方法能把缓存在io中的数据释放出来。

    5. 内置的format方法能够格式化数据,比如format("%.2f",x)

    6. Ruby中,可以给常量,变量,方法,类,模块命名,并且可以通过名称的第一个字符确定是什么名称。

    7. 小写字母指的是从az,下划线是_,大写字母指的是从AZ,数字指的是从09,这些都是合法字符。

    8. 名称以小写字母或者大写字母或者下划线开头,后面可以跟大小写字母,数字以及下划线的任意组合。

    9. ruby程序中,不需要给变量做任何声明(类型,作用域)。通过变量名可以区分出变量的作用域。

    10. 谨记本地变量,实例变量,类和模块,全局变量,常量,以及方法的命名规则。

    11. "?" "!" 是唯一的可以跟在方法名后面的不合法字符。

    12. ruby规范说明,如果方法或变量名由多个词组成,词和词之间用_隔开。如果是类,模块或者常量,不使用_,只需要把单词的首字母大写就可以了。比如,my_variable, MyModule, MyClass, MyConstant.

    13. 变量可以引用任何类型的对象,并且同一个变量可以在不同时刻引用不同类型的对象。

    14. ruby中的变量都是对象的引用,变量生效后,ruby会自动做垃圾收集。

    15. ruby是动态类型的语言,你所操作的都是对象,返回的结果也是对象。

    16. ruby中的基本类型有Numeric(包括Fixnum, IntegerFloat子类型), String, Array, Hash, Object, Symbol, RangeRegEx

    17. 通过self方法可以查看在哪个对象中。

    18. 使用defend来声明方法。参数是扩在括号里的本地变量。

    19. 方法不需要声明返回类型,返回的是最后一行的值。

    20. 最好在不同的方法声明间加一行空行。

    21. ruby规范说明要把参数扩在括号中。

    22. 方法名后面唯一可以跟的非合法字符就是'!''?'

    23. '!'结尾的方法总是返回对象本身,而不是一个拷贝。

    24. 可以使用'='给参数指定默认值,如果调用方法时,没有传参数值,会使用默认值。

    25. #{...}返回的是括号中的表达式的结果。

    26. 方法的别名能给方法生成一个拷贝,所以即使原方法发生变化,别名不会跟着变化。

    27. 方法的参数个数可以是变化的。

    28. 方法的参数个数没有限制。

    29. 参数的排列顺序是从左到右。

    30. 方法是按值传递还是引用传递,一直还在讨论中,等待结果吧
  • Ruby学习总结一

    2008-01-22 17:18:03

    总结一

    1. 我们的例子来自Windows平台,ruby版本号是1.8.6

    2. Ruby是一个解释型语言。

    3. 记住在Ruby中,解决一个问题会有多种方法

    4. 例子程序都是在SciTE编辑器中运行的,如何配置它,请看 "第一个ruby程序"

    5. 所有的ruby源程序都以.rb做扩展名。

    6. ruby程序的执行是从上到下一行行顺序执行的。

    7. 特性:格式灵活, 大小写敏感, 两种注释方式, 语句分行符, 38个关键字。

    8. 只有保留关键字falsenil代表false,其他都是true

    9. ruby有丰富的在线文档。

    10. puts (s代表string; puts 意思是输出字符串) 输出它后面内容到控制台,并且自动换行。

    11. 方法调用中的括号是可选的。下面的方法调用都是合法的: foobar foobar() foobar(a, b, c) foobar a, b, c

    12. Ruby, 带小数点的数叫浮点数或实数,不带小数点的叫整数。

    13. 常用的操作符,+-×/

    14. 没有++--运算符

    15. 括号中的表达式优先运算。

    16. 了解求模运算规则。

    17. 当你用整数运算时,结果也是整数类型的。

    18. 字符串是包括在单引号或双引号中间的字符组合。

    19. Ruby, 字符串是变长的,可以按需扩展,这样做不会耗费太多时间和内存。

    20. 使用+可以把两个字符串连在一起。

    21. \ 是转义字符,比如: \", \\, \n

    22. ''是一个空字符串.

    23. 如果得到一个编译错误- #<TypeError: cannot convert Fixnum into String> ,意思是你不能把一个整数加到字符串中,或者不能用一个字符串乘另一个字符串。

    24. 常量以大写字母开头。

    25. 变量不会预留地址和空间,只有读到变量定义后才会定义变量。给变量初始化为nil是一个好习惯。

    26. x, y = y, x会得到y的值,y会得到nil;变量和值的数目要对应。值的数目少了,用nil补;如果多了,丢弃。

    27. 本地变量要以小写字母或者下划线开头,包含并且只能包含字母,数字和下划线。

    28. .to_i, .to_f, .to_s 用来转换成integer, float, string

    29. 操作符 << 用来append字符串。

  • 闰年的算法

    2008-01-22 16:20:39

    计算是否是闰年,其实关键是闰年的算法,也就是闰年的来历。先看完下面的资料,估计就大体明白了。关于公历闰年是这样规定的:地球绕太阳公转一周叫做一回归年,一回归年长365日5时48分46秒。因此,公历规定有平年和闰年,平年一年有365日,比回归年短0.2422日,四年共短0.9688 日,故每四年增加一日,这一年有366日,就是闰年。但四年增加一日比四个回归年又多0.0312日,400年后将多3.12日,故在400年中少设3个闰年,也就是在400年中只设97个闰年,这样公历年的平均长度与回归年就相近似了。由此规定:年份是整百数的必须是400的倍数才是闰年,例如1900 年、2100年就不是闰年。 我们居住的地球总是绕着太阳旋转的。地球绕太阳转一圈需要365天5时48分46秒,也就是365.2422天。为了方便,一年定为365天,叫做平年;这样每过四年差不多就要多出一天来,把这一天加在2月里,这一年就有366天,叫做闰年。 通常,每四年里有三个平年一个闰年。公历年份是4的倍数的,一般都是闰年。 按照每四年一个闰年计算,平均每年就要多算出0.0078天,这样经过四百年就会多算出大约3天来,因此,每四百年中要减少三个闰年。所以规定,公历年份是整百数的,必须是400的倍数的才是闰年,不是400的倍数的就是平年。 也就是我们通常所说的: 四年一闰,百年不闰,四百年再闰。
    Ruby程序如下:
    year=nil
    while year!='exit'
      puts 'input a year with format like yyyy:'
      STDOUT.flush
      year=gets.chomp
      if year!='exit' then
        year=year.to_i
      leap = case
        when (year % 4==0 && year % 100 != 0) || year % 400 == 0: true
        else false
      end
      puts leap
      end
    end

262/2<12
Open Toolbar