Ruby现在很火啊,那就看看吧。。。。
看得Little Book of Ruby(附件)。原因,够简练。。。。先入个门。用的intellij idea7.04。现在ruby插件好像开发得不错了,我用着挺爽。
第一章
1.Ruby里什么都是对象,基本类型也不例外,比java还oo。。。
示例代码:
经典到烂的Hello World。比java省事很多。。。
puts "Hello World"
print("Please input your name:")
name = gets()
puts "hello #{name}".upcase
(1)print与puts的区别。print不换行,puts换行。。。。
(2)在ruby里,你想什么时候使用变量就什么时候使用,不必要事先定义,ruby会自己判断变量类型。
(3)ruby和java一样是大小写敏感的。
(4)gets后的括号,和print,puts后的括号一样,都是可选择的,只要不引起误解,都可以去掉。(不建议。)
(5)#{}取变量值贝。。。
puts("#{1*2+3}")
2.Ruby中的方法。使用def定义,后面跟方法名,要小写。
def saysomething
puts("Hello")
end
#invoke
saysomething
传参数
def saysomething(name)
puts("Hello #{name}")
end
#invoke
saysomething("Ivan")
def saysomething(name)
return ("Hello #{name}")
end
#invoke
puts (saysomething("Ivan"))
puts ("HOHO,#{saysomething("Ivan")}")
(1)#号为注释符号,相当于java里的//
(2)再看看#{}的效果吧。。。。
3数字和string一样简单
subtotal = 100
taxrate = 0.175
tax = subtotal * taxrate
puts "Tax on $#{subtotal} is $#{tax}, so grand total is $#{subtotal+tax}"
taxrate = 0.175
print "Enter price (ex tax): "
s = gets
subtotal = s.to_f
if (subtotal < 0.0) then
subtotal = 0.0
end
tax = subtotal * taxrate
puts "Tax on $#{subtotal} is $#{tax}, so grand total is $#{subtotal+tax}"
(1)s.to_f是字符串里的一个方法,作用是将字符串转化为float,如果无法转化,则返回0.0。比如"Hello World".to_f.
(2)if...then...end。就是java里的if,if后面的括号也不是必须的。但是如果这一句写在了一行上面,那么括号就是必须的了。end也是必须的,否则无法运行
第二章
1.Ruby的类定义,与java也类似,也以class 开头,加类名
class MyClass
end
ob = MyClass.new
很简单。
(1)在这个类里面,虽然什么都没有定义,但是Ruby会自动的继承Object类。所以,可以调用ob.class
(2)类名的第一个字母必须大写。
2.类实例和实例变量
class Dog
def set_name(name)
@dogname = name
end
def get_name()
return @dogname
end
end
dog = Dog.new
dog.set_name("Jack")
puts dog.get_name
(1)@dogname此为实例变量,属于Dog实例,不需要事先声明
(2)如果不给@dogname设值,即不先调用dog.set_name("Jack"),而直接puts dog.get_name,不会像java那样获得空指针异常,返回一个nil
class Dog
def initialize(init_name)
@dogname = init_name
end
def set_name(name)
@dogname = name
end
def get_name()
return @dogname
end
def to_s
return "Hello"
end
end
dog = Dog.new "Jack"
#dog.set_name("Jack")
puts dog.inspect
p dog
puts dog
puts dog.get_name
(1)def initialize(init_name)
@dogname = init_name
end
相当于java里的构造方法。。。
(2)def to_s
return "Hello"
end
是从Object继承的,和java也类似toString()方法。。。。
(3)dog.inspect会打印关于实例的信息。
(4)p dog为上面的简写。
第三章
1继承,与java一样,也是单继承。
class Thing
def initialize( aName, aDescription )
@name = aName
@description = aDescription
end
def get_name
return @name
end
def set_name( aName )
@name = aName
end
def get_description
return @description
end
def set_description( aDescription )
@description = aDescription
end
end
class Treasure < Thing # Treasure descends from Thing
def initialize( aName, aDescription, aValue )
super( aName, aDescription )
@value = aValue
end
def get_value
return @value
end
def set_value( aValue )
@value = aValue
end
end
# This is where our program starts...
t1 = Treasure.new("Sword", "an Elvish weapon forged of gold",800)
t2 = Treasure.new("Dragon Horde", "a huge pile of jewels", 550)
puts "This is treasure1: #{t1.inspect}"
puts "This is treasure2: #{t2.inspect}"
puts "t1 name=#{t1.get_name}, description=#{t1.get_description}, value=#{t1.get_value}"
t1.set_value( 100 )
t1.set_description(" (now somewhat tarnished)")
puts "t1 (NOW) name=#{t1.get_name}, description=#{t1.get_description}, value=#{t1.get_value}"
(1)继承写法如下class Treasure < Thing
(2)super( aName, aDescription )与java功能相同
第四章
1如果嫌get,set方法太麻烦了。可以这么写
class Thing
def name=(aName)
@name = aName
end
def adescription=(desc)
@description = desc
end
def name
return @name
end
def adescription
return @description
end
end
thing = Thing.new
thing.adescription="HHHH"
puts thing.adescription
注意def adescription=(desc)等号之间不能有空格。。。
更简单的写法
class Thing
attr_reader:adescription
attr_writer:adescription
end
thing = Thing.new
thing.adescription ="HHHH"
puts thing.adescription
再简单点。。。
class Thing
attr_accessor:adescription
end
thing = Thing.new
thing.adescription ="HHHH"
puts thing.adescription
2类变量
写法
@@变量名
,和java里的类属性(静态属性)作用相同。
第五章
1.ruby中的array与java中的有区别。它可以在一个array里存放多种类型。
a = ['hello',1.0,1]
puts(a[0],a[1])
2.ruby可以数组越界。。。。超出数组返回nil
3.ruby数组可以存放方法。
def hello
return "hi"
end
a = ['hello',hello,1]
puts(a[0],a[1])
4多维数组创建方法,先创建一个数组,再在该数组里添加数组。
a = Array.new(2)
a[0]= Array.new(2,'hello')
a[1]= Array.new(2,'world')
或者直接写
a = [ [1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16] ]
5,数组遍历使用for...in...end,与java里的foreach循环很相似
a = [['one','two','three','four'],[1,2,3,4]]
for i in a
for j in i
puts j
end
end
还可以这么写
a = [['one','two','three','four'],[1,2,3,4]]
for (a,b,c,d) in a
puts "a = #{a},b = #{b},c = #{c},d = #{d}"
end
6对数组下标的操作,-1表示最后一位
arr = ['h','e','l','l','o',' ','w','o','r','l','d']
print( arr[0,5] ) #=> ,hello'
print( arr[-5,5 ] ) #=> ,world'
print( arr[0..4] ) #=> ,hello'
print( arr[-5..-1] ) #=> ,world'
在1,2两个输出中的第二个参数表示向后几位,不是下标,3,4两个输出的第二个数字才是下标。
7,通过下标也能改变数组
arr2 = ['h','e','l','l','o',' ','w','o','r','l','d']
arr2[0] = 'H'
arr2[2,2] = 'L', 'L'
arr2[4..6] = 'O','-','W'
arr2[-4,4] = 'a','l','d','o'
# arr2 now contains:
# ["H", "e", "L", "L", "O", "-", "W", "a", "l", "d", "o"]
第六章
1.ruby里的hash应该就是java里的map了。创建方法
h1 = Hash.new
h2 = Hash.new("hello")
这两个都创建了一个Hash,区别是,在h1里如果找不到对应的值则返回nil,h2则返回hello
2.向Hash里添加数据,和数组类似,区别是数组是数字,而Hash只要是独一无二的数据即可
h1['a'] = 'hi'
还可以这样添加数据
h1 = {'a'=>'hh','b'=>'hehe'}
3获取Hash的值,和java里的map相同,通过key来获取,如果没有则返回默认值,见1.可以通过Hash里的default来设置默认值
h1.default = "hi"
4对Hash的操作,看代码体会吧。
h1 = {'key1'=>'val1', 'key2'=>'val2', 'key3'=>'val3', 'key4'=>'val4'}
h2 = {'key1'=>'val1', 'KEY_TWO'=>'val2', 'key3'=>'VALUE_3',
'key4'=>'val4'}
p( h1.keys & h2.keys ) # set intersection (keys)
#=> ["key1", "key3", "key4"]
p( h1.values & h2.values ) # set intersection (values)
#=> ["val1", "val2", "val4"]
p( h1.keys+h2.keys ) # concatenation
#=> [ "key1", "key2", "key3", "key4", "key1", "key3", "key4", "KEY_TWO"]
p( h1.values-h2.values ) # difference
#=> ["val3"]
p( (h1.keys << h2.keys) ) # append
#=> ["key1", "key2", "key3", "key4", ["key1", "key3", "key4", "KEY_TWO"]
]
p( (h1.keys << h2.keys).flatten.reverse ) # ,un-nest' arrays and reverse
#=> ["KEY_TWO", "key4", "key3", "key1", "key4", "key3", "key2", "key1"]
a =[1,2,3]
b =[4,5,6]
c = a + b #=> c=[1, 2, 3, 4, 5, 6] a=[1, 2, 3]
a << b #=> a=[1, 2, 3, [4, 5, 6]]
a=[1, 2, 3, [4, 5, 6]]
a.flatten #=> [1, 2, 3, 4, 5, 6]
第七章
1.for循环,上面有用过,类似java的foreach循环
for i in [1,2,3] do
puts i
end
do可省略
另一种写法,有点陌生
[1,2,3].each do |i|
puts i
end
2.while循环,看代码。
while tired
sleep
end
sleep while tired
这两段代码效果相同。不是java里while与do...while的区别.如果要do...while的效果,要这么写
begin puts(x) end while (x < 1)
3.until循环
i = 10
until i == 10 do puts(i) end # never executes
until i == 10 # never executes
puts(i)
i += 1
end
puts(i) until i == 10 # never executes
begin # executes once
puts(i)
end until i == 10
第八章
1.if...then前面就有了。
if (subtotal < 0.0) then
subtotal = 0.0
end
2.if...then...else
if aDay == 'Saturday' or aDay == 'Sunday'
daytype = 'weekend'
else
daytype = 'weekday'
end
如果代码在一行,则then不能省略,或者用:代替,不在一行则可省略
3.and...or...not
if aDay == 'Saturday' or aDay == 'Sunday' and not working_overtime
#Ruby takes the test to mean: “If the day is Saturday and I am
#not working overtime, or if the day is Sunday and I am #not working overtime”
#whereas what I really meant was “If the day is Saturday; or if the #day is Sunday
#and I am not working overtime”.
if aDay == 'Saturday' or (aDay == 'Sunday' and not working_overtime)
and(&&),or(||),not(!)
4.if...elsif
while input != 'q' do
puts("Enter a number between 1 and 1000 (or 'q' to quit)")
print("?- ")
input = gets().chomp()
if input == 'q'
puts( "Bye" )
elsif input.to_i > 800
puts( "That's a high rate of pay!" )
elsif input.to_i <= 800
puts( "We can afford that" )
end
end
5.unless
unless aDay == 'Saturday' or aDay == 'Sunday'
daytype = 'weekday'
else
daytype = 'weekend'
end
等价于
if !(aDay == 'Saturday' or aDay == 'Sunday')
daytype = 'weekday'
else
daytype = 'weekend'
end
6.if,unless的其他写法
sleep if tired
begin
sleep
snore
end if tired
sleep unless not tired
begin
sleep
snore
end unless not tired
7,case
case( i )
when 1 : puts("It's Monday" )
when 2 : puts("It's Tuesday" )
when 3 : puts("It's Wednesday" )
when 4 : puts("It's Thursday" )
when 5 : puts("It's Friday" )
when (6..7) : puts( "Yippee! It's the weekend! " )
else puts( "That's not a real day!" )
end
和java很类似啦,里面:可以替换为then
第九章
1.module(不知道翻译成模块对不对,就不翻译了)。创建方法和类很相似
module MyModule
HE = 'hello'
def sayHello
return "hi,#{HE}"
end
end
module和类的区别,类有实例,有父类,可以有子类。module一个都没有。
2.module的第一个作用,作为namespace
module可以当作一些方法,类,属性的集合。在这个集合里他们可以互相访问,外面则不行。
module很像java里的package。。。。
class MyClass
include MyModule
def sayHi
puts( sayHello)
end
end
如果不是在同一个文件里,那么先调用文件
require("***.rb")
该文件必须在当前目录或类路径,或在$:这个数组里。添加到数组里的方法是。
$:<<"***.rb"
第十章
对一些类库,ruby相关的介绍。。。