Ruby学习笔记

Ruby现在很火啊,那就看看吧。。。。
看得Little Book of Ruby(附件)。原因,够简练。。。。先入个门。用的intellij idea7.04。现在ruby插件好像开发得不错了,我用着挺爽。

[size=x-large]第一章[/size]
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也是必须的,否则无法运行


[size=x-large]第二章[/size]
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为上面的简写。


[size=x-large]第三章[/size]
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功能相同


[size=x-large]第四章[/size]
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里的类属性(静态属性)作用相同。

[size=x-large]第五章[/size]
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"]


[size=x-large]第六章[/size]
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]


[size=x-large]第七章[/size]
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


[size=x-large]第八章[/size]
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

[size=x-large]第九章[/size]
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"


[size=x-large]第十章[/size]
对一些类库,ruby相关的介绍。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值