在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
一、比较语句 大部分和其他的语言一样,这里注意<=>、
条件语句 如下几种形式
注意在ruby中只有nil和false为假。 x=1 if x==1 puts 1 elsif x==2 puts 2 else puts 3 end 注意是elsif,不是elseif。与c相比,多了个end。
但Ruby的case语句和C/C++的格式差异很大: case 被判断项 when 比较值 then 代码 when 比较值 then 代码 else 代码 end def [](index) case index when 0, -2 then @x when 1,-1 then @y when :x,"x" then @x when :y,"y" then @y else nil end end p[0],p[-2]都返回x 例如,下面两段代码是等价的,但使用case的代码更加清晰: if var < 60 print "failed/n" elsif var < 70 print "passed/n" elsif var < 80 print "good/n" elsif var < 90 print "great/n" else print "excellent/n" end case var when 0..59 then print "failed/n" when 60..69 then print "passed/n" when 70..79 then print "good/n" when 80..89 then print "great/n" else print "excellent/n" end
case具有两种形式,下面的是一种, name =case when x==1 then "one" when x==2 then "two" else "many" end puts name 你可以用一个换行符或分号(分号ruby1.9不适用)替代那个跟在when从句后面的关键字when: name =case when x==1 "one" when x==2 "two" else "many" end puts name case语句中的else从句是可选的,如果没有为true的when从句,而且存在一个else从句,那么位于else和end之间的代码将被执行。这块代码中最后执行的表达式的值将被作为整个case语句的值。如果没有为true的when从句,而且没有else从句,那么就不会执行任何代码,而且case语句的返回值为nil。 case 语句中的一个when从句可以包含多个表达式(用逗号分隔),只要有一个为true就会执行。在简单形式的case语句中,逗号作用不大,就好像一个||操作符一样: 目前为止,展示的case比较简单,实际上case的功能比这个强大的多。在大部分例子中,每个when从句的左侧都是一样的。在case的常用形式里,我们将这些when从句的左侧提取出来,与case本身关联在一起: name = case x when 1 #just the value compare to x "one" when 2 then "two" when 3; "three" else "many" end puts name 理解case语句重点在于,搞清楚when从句的值如何与case关键字后的表达式的值相比较的。这个比较使用的是===操作符。 puts case x when String then "string" when Numeric then "numeber" when TrueClass,FalseClass then "boolean" else "other" end
# Compute 2006 U.S. income tax using case and Range objects tax = case income when 0..7550 income * 0.1 when 7550..30650 755 + (income-7550)*0.15 when 30650..74200 4220 + (income-30655)*0.25 when 74200..154800 15107.5 + (income-74201)*0.28 when 154800..336550 37675.5 + (income-154800)*0.33 else 97653 + (income-336550)*0.35 end
# Get user's input and process it, ignoring comments and exiting # when the user enters the word "quit" while line=gets.chomp do # Loop, asking the user for input each time case line when /^\s*#/ # If input looks like a comment... next # skip to the next line. when /^quit$/i # If input is "quit" (case insensitive)... break # exit the loop. else # Otherwise... puts line.reverse # reverse the user's input and print it. end end A when clause can have more than one expression associated with it. Multiple expressions def hasValue?(x) # Define a method named hasValue? case x # Multiway conditional based on value of x when nil, [], "", 0 # if nil===x || []===x || ""===x || 0===x then false # method return value is false else # Otherwise true # method return value is true end end case与c++中switch区别: 三元操作符 def how_many_messages(n) #handle singular/plural "you have" + n.to_s + (n==1 ? " message. " : " messages. ") end how_many_messages 1 注意: "you have" + n.to_s +(n==1 ? " message. " : " messages. ") 画红线的地方要有空格,否则错误: F:/ruby/rubySource/ControllStrutrue.rb:44: warning: ambiguous first argument; put parentheses or even spaces 循环迭代语句 x.times
x.updo,x.downto,x.step(limit,steplength)
在大多数语言里,if条件式是一个语句,但在ruby中,一切都是表达式,包括哪些通常被称为语句的控制结构。一个if语句的返回值就是被执行的代码中最后一个表达式的值;如果没有执行任何代码,那么返回值就是nil。 作为if语句能返回一个值的例子,我们可以优雅地将前面提到的多路条件式写成这样: name = if x == 1 then "one" unless和if相反,不能接elsif。 作为修饰符的if(if as a modifier) (python可以,如: >>> x=1 ) :循环语句 while and until # Count back up to 10 using an until loop
作为修饰符的while和until
如果一个循环体仅包含一个ruby表达式,那么你可以将while和until作为修饰符置于该表达式之后,以一种非常紧凑的形式来表达该循环,比如:
for in循环 The for loop, or for/in loop, iterates through the elements of an enumerable object 注意:do关键字是可选的,可以被newline或分号替代。 当然,这么写没错: for key,value in hash do puts "#{key}=>#{value}" end for循环对each迭代器方法的依赖意味着它非常像迭代器,比如,上面的例子可以写成这样: 迭代器和可枚举对象(Iterators and enumerable objects)虽然while,until和for循环是ruby语言的核心部分之一,但是通常情况下我们更倾向是使用一个特殊的方法来编写循环,那就是迭代器,迭代器是ruby最为重要的特性之一,下面是一些新手入门常用的例子: The times, each, map, and upto methods are all iterators, and they interact with the Iterators that Don’t Iterate。 “期待一个关联代码块的方法” chars = "hello world".tap {|x| puts "original object: #{x.inspect}"} .each_char .tap {|x| puts "each_char returns: #{x.inspect}"} .to_a .tap {|x| puts "to_a returns: #{x.inspect}"} .map {|c| c.succ } .tap {|x| puts "map returns: #{x.inspect}" } .sort .tap {|x| puts "sort returns: #{x.inspect}"}
each迭代器并不是那些传统的“数据结构”(数组,hash等)类的专利,ruby的IO类也定义了一个each迭代器,他可以把那些从输入/输出对象中读取出来的文本行传递尽量,因此在ruby中你可以像下面这样处理一个文件的行: filename="F:/ruby/rubySource/data.txt" File.open(filename) do |f| #open named file,pass as f f.each { | line | print line} end 大多数定义了each方法的类都包含Enumerable模块,它定义了许多更特殊的迭代器,而他们都是基于each方法来实现的,each_with_index就是这些有用的迭代器其中之一。先前的例子,我们可以给每行添加一个行号: File.open(filename) do |f| #open named file,pass as f f.each_with_index { | line,number | print "#{number}:#{line}" } end
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论