51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 18578|回复: 25
打印 上一主题 下一主题

通过例子学ruby

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2009-8-20 17:06:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
以下都是从国外网站翻译过来,自己学习的时候总结了一下,希望对大家学习ruby有所帮助。
1. Problem: “Display series of numbers (1,2,3,4, 5….etc) in an infinite loop. The program should quit if someone hits a specific key (Say ESCAPE key).”
解决方案

   1. i = 0   
   2. loop { print "#{i+=1}, " }   

     虽然是一个很简单的问题,但我想着想着却觉得这个问题很有意思,原文中也没有给出很完美的答案,不知道谁有好的解决方法。

2. Problem: “Fibonacci series, swapping two variables, finding maximum/minimum among a list of numbers.”
解决方案

   1. #Fibonacci series   
   2. Fib = Hash.new{ |h, n| n < 2 ? h[n] = n : h[n] = h[n - 1] + h[n - 2] }   
   3. puts Fib[50]   
   4.     
   5. #Swapping two variables   
   6. x,y = y,x   
   7.     
   8. #Finding maximum/minimum among a list of numbers   
   9. puts [1,2,3,4,5,6].max   
  10. puts [7,8,9,10,11].min   



语法知识:

1.Hash。Hash在实例话的时候可以在new里边接受一个参数值,或者一个模块,它实际上不是hash对象的一个值,仅当在hash操作的时候找不到这个值对应的项的时候返回。

2.交换两个变量。

3.查询数组里最大最小的值,有专门的API。

3. Problem: “Accepting series of numbers, strings from keyboard and sorting them ascending, descending order.”

解决方案

   1. a = []   
   2. loop { break if (c = gets.chomp) == ‘q’; a << c }   
   3. p a.sort   
   4. p a.sort { |a,b| b<=>a }   



语法:

   1. loop循环,及break的应用
   2. 从键盘读入字符 gets.chomp
   3. 将一项插入到数组 a << c
   4. 对于数组的正序和倒序的排序。



4. Problem: “Reynolds number is calculated using formula (D*v*rho)/mu Where D = Diameter, V= velocity, rho = density mu = viscosity Write a program that will accept all values in appropriate units (Don’t worry about unit conversion) If number is < 2100, display Laminar flow, If it’s between 2100 and 4000 display 'Transient flow' and if more than '4000', display 'Turbulent Flow' (If, else, then...)"
ruby 代码

   1. vars = %w{D V Rho Mu}   
   2.     
   3. vars.each do |var|   
   4.   print "#{var} = "  
   5.   val = gets   
   6.   eval("#{var}=#{val.chomp}")   
   7. end  
   8.     
   9. reynolds = (D*V*Rho)/Mu.to_f   
  10.     
  11. if (reynolds < 2100)   
  12.   puts "Laminar Flow"  
  13. elsif (reynolds > 4000)   
  14.   puts "Turbulent Flow"  
  15. else  
  16.   puts "Transient Flow"  
  17. end  

语法:

没有搞清楚vars = %w{D V Rho Mu}  这一句是什么意思。

5. Problem: “Modify the above program such that it will ask for ‘Do you want to calculate again (y/n), if you say ‘y’, it’ll again ask the parameters. If ‘n’, it’ll exit. (Do while loop) While running the program give value mu = 0. See what happens. Does it give ‘DIVIDE BY ZERO’ error? Does it give ‘Segmentation fault..core dump?’. How to handle this situation. Is there something built in the language itself? (Exception Handling)”
ruby 代码

   1. vars = { "d" => nil, "v" => nil, "rho" => nil, "mu" => nil }   
   2.     
   3. begin  
   4.   vars.keys.each do |var|   
   5.     print "#{var} = "  
   6.     val = gets   
   7.     vars[var] = val.chomp.to_i   
   8.   end  
   9.     
  10.   reynolds = (vars["d"]*vars["v"]*vars["rho"]) / vars["mu"].to_f   
  11.   puts reynolds   
  12.     
  13.   if (reynolds < 2100)   
  14.     puts "Laminar Flow"  
  15.   elsif (reynolds > 4000)   
  16.     puts "Turbulent Flow"  
  17.   else  
  18.     puts "Transient Flow"  
  19.   end  
  20.     
  21.   print "Do you want to calculate again (y/n)? "  
  22. end while gets.chomp != "n"   



6.一个计算器的问题,代码太多。

7. Problem: “Printing output in different formats (say rounding up to 5 decimal places, truncating after 4 decimal places, padding zeros to the right and left, right and left justification)(Input output operations)”
ruby 代码

   1. #rounding up to 5 decimal pleaces   
   2. puts sprintf("%.5f", 124.567896)   
   3.     
   4. #truncating after 4 decimal places   
   5. def truncate(number, places)   
   6.   (number * (10 ** places)).floor / (10 ** places).to_f   
   7. end  
   8.     
   9. puts truncate(124.56789, 4)   
  10.     
  11. #padding zeroes to the left   
  12. puts ‘hello’.rjust(10,’0‘)   
  13.     
  14. #padding zeroes to the right   
  15. puts ‘hello’.ljust(10,’0‘)   
  16.     
  17.   

语法:





   1. 格式化sprintf。
   2. 左填充和右填充

  8. Problem: “Open a text file and convert it into HTML file. (File operations/Strings)”

这段代码比较长,其中有些东西还是不太理解,还要看看正则表达式,谁能告诉我下边的代码是怎么执行的吗:

   1. rules = {‘*something*’ => ‘something’,      
   2.          ’/something/’ => ‘something’}      
   3.        
   4. rules.each do |k,v|      
   5.   re = Regexp.escape(k).sub(/something/) {"(.+?)"}      
   6.   doc.gsub!(Regexp.new(re)) do     
   7.     content = $1     
   8.     v.sub(/something/) { content }      
   9.   end     
  10. end   

9. Problem: “Time and Date : Get system time and convert it in different formats ‘DD-MON-YYYY’, ‘mm-dd-yyyy’, ‘dd/mm/yy’ etc.”
ruby 代码

   1. time = Time.now   
   2. puts time.strftime("%d-%b-%Y")   
   3. puts time.strftime("%m-%d-%Y")   
   4. puts time.strftime("%d/%m/%Y")   

10. Problem: “Create files with date and time stamp appended to the name”
ruby 代码

   1. #Create files with date and time stamp appended to the name   
   2. require 'date'   
   3.     
   4. def file_with_timestamp(name)   
   5.   t = Time.now   
   6.   open("#{name}-#{t.strftime('%m.%d')}-#{t.strftime('%H.%M')}", 'w')   
   7. end  
   8.     
   9. my_file = file_with_timestamp('pp.txt')   
  10. my_file.write('This is a test!')   
  11. my_file.close   



11. Problem: “Input is HTML table. Remove all tags and put data in a comma/tab separated file.”

12. Problem: “Extract uppercase words from a file, extract unique words.”

   1. open('some_uppercase_words.txt').read.split().each { |word| puts word if word =~ /^[A-Z]+$/ }   
   2.     
   3. words = open(some_repeating_words.txt).read.split()   
   4. histogram = words.inject(Hash.new(0)) { |hash, x| hash[x] += 1; hash}   
   5. histogram.each { |k,v| puts k if v == 1 }  

语法:(对于第四行还是不太懂,谁能给我讲一下呢)

1.打开文件,读取文件,split(),正则表达式匹配。

13. Problem: “Implement word wrapping feature (Observe how word wrap works in windows ‘notepad’).”
ruby 代码

   1. input = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."  
   2.   
   3.   
   4. def wrap(s, len)   
   5.   result = ''  
   6.   line_length = 0   
   7.   s.split.each do |word|   
   8.     if line_length + word.length + 1  < len   
   9.       line_length += word.length + 1   
  10.       result += (word + ' ')   
  11.     else  
  12.       result += "\n"  
  13.       line_length = 0   
  14.     end  
  15.   end  
  16.   result   
  17. end  
  18.     
  19. puts wrap(input, 30)   



14. Problem: “Adding/removing items in the beginning, middle and end of the array.”
ruby 代码

   1. x = [1,3]   
   2.     
   3. #adding to beginning   
   4. x.unshift(0)   
   5. print x   
   6. print "\n"  
   7.     
   8. #adding to the end   
   9. x << 4   
  10. print x   
  11. print "\n"  
  12. #adding to the middle   
  13. x.insert(2,2)   
  14. print x   
  15. print "\n"  
  16. #removing from the beginning   
  17. x.shift   
  18. print x   
  19. print "\n"  
  20. #removing from the end   
  21. x.pop   
  22. print x   
  23. print "\n"  
  24. #removing from the middle   
  25. x.delete(2)   
  26. print x   
  27. print "\n  



15. Problem: “Are these features supported by your language: Operator overloading, virtual functions, references, pointers etc.”

Solution: Well this is not a real problem (not in Ruby, at least). Ruby is a very high level language ant these things are a must .
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1
回复

使用道具 举报

该用户从未签到

26#
发表于 2011-9-9 00:14:32 | 只看该作者
刚刚看过基础教程,感觉有点难记,
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2017-12-25 13:44
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    25#
    发表于 2011-4-22 10:56:25 | 只看该作者
    有例子,有解释,不错,好学习。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24#
    发表于 2011-2-19 18:32:11 | 只看该作者
    子木 现在真是了不得啊,两年不见都是斑竹了 对ruby也可以说是高手了啊!!什么时候给我指点一下,我对ruby一知半解
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23#
    发表于 2010-11-25 15:34:05 | 只看该作者
    好东西,呵呵
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    22#
    发表于 2010-11-22 10:27:32 | 只看该作者
    先收藏了,学习学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2015-5-25 17:24
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]测试排长

    21#
    发表于 2010-11-17 23:42:52 | 只看该作者
    不错。。 学习 学习!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    20#
    发表于 2010-10-10 11:23:39 | 只看该作者
    Ruby在书写和可读性上太抽象了,完全不适合我这种没有逻辑头脑的人……身之不能,心向往之……
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    19#
    发表于 2010-10-5 02:53:02 | 只看该作者
    终于找到 了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    18#
    发表于 2010-9-28 09:57:40 | 只看该作者
    复杂
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    17#
    发表于 2010-9-4 14:47:45 | 只看该作者
    本帖最后由 tings 于 2010-12-1 10:56 编辑

    看不懂,太复杂了。








    ——————————————————————
    my friends have recently started cheap wow gold.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    16#
    发表于 2010-7-28 09:12:28 | 只看该作者
    先记着
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    15#
    发表于 2010-6-25 14:31:11 | 只看该作者
    学习学习。。。。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    14#
    发表于 2010-5-21 15:14:12 | 只看该作者

    学到东西了,一直在思考模块化的问题

    我用了最笨的load  学到东西了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    13#
    发表于 2010-5-12 15:45:26 | 只看该作者
    原帖由 Spark.lee 于 2009-8-20 17:06 发表
    以下都是从国外网站翻译过来,自己学习的时候总结了一下,希望对大家学习ruby有所帮助。
    1. Problem: “Display series of numbers (1,2,3,4, 5….etc) in an infinite loop. The program should quit if someone h ...

    vars = %w{D V Rho Mu}  这一句是什么意思
    TO 楼主
    这句话的意思是vars={"D","V","Rho","Mu"}
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    12#
    发表于 2010-5-7 21:42:11 | 只看该作者
    学习呀,我最近也在看这个
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11#
    发表于 2010-4-6 09:19:45 | 只看该作者
    来学习了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    10#
    发表于 2010-4-1 16:27:55 | 只看该作者

    赞一个

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2010-1-5 10:18:20 | 只看该作者
    我也学习了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    8#
    发表于 2009-11-20 11:24:29 | 只看该作者
    学习了
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-7 05:17 , Processed in 0.079086 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表