ruby学习笔记(1)

1) ruby的函数在调用的时候可以加括号,也可以不加括号。

函数定义的格式也比较奇怪:

==============================

def hello (name)

     print("Hello World, ",name,"\n")

end

hello("ruby")

==============================

2) ruby的输出方法有print,puts,p和pp。其中print是普通输出,它接受多个参数,在输出的时候会把所有参数拼起来然后输出;puts和print类似,不同的地方在于puts会在输出之后自动加上换行,如果传了多个参数,那个每个参数后都会自动加上换行;p和pp设计的目的都是为给程序员调试用的,它们输出的信息能包含更多信息,例如字符串在输出的时候会加上引号,pp和p不同的地方在于pp输出时会自动加入缩进和换行,让数据显示时的可读性更好。

3)单引号和双引号。和php一样,单引号中不能包含变量,双引号中可以包含变量。在ruby中,单引号中的\n这样表示换行之类的转义字符都会无效,直接输出出来。

4)注释。 ruby中的注释和c系语言不同,不是使用//和/**/,取而代之的是#和=begin,=end。

=============================

=begin

     我是一个多行注释哦,

     我换行了,

      我又换行了

=end

# 我是一个单行注释

=============================

5) if判断。 也和C系不同,看起来更像是vb的语法。没有{}这样明显的分隔,如果不加上缩进的话,可读性该有多差啊@_@

=============================

if a >= 10 then

    print("big")

else

     print("small")

end

==============================

6) 循环。使用while:

==============================

i = 1

while i <= 10

   print(i,"\n")

    i = i + 1

end

==============================

使用times方法。当循环次数确定时,使用times方法会更简单:

==============================

100.times {|i|

   print "hello ",i,"\n"

}

100.times do |i|

   print "hello",i,"\n"

end

==============================

使用for。ruby的for有两种用法,一种是类似于C系的for(var i=0;i<length;i++){}的:

==============================

sum = 0

for i in 2..5

   sum += i

end

print sum

==============================

另一种类似于js的for(var p in Obj){}:

==============================

names = ["a","b","c"]

for name in names

    print name,"\n"

end

==============================

和js的for (p in obj)不同的是,这里的p不是索引。例如上面代码的输出不是0,1,2,而是"a","b","c"。

如果换成是hash,又会怎么样呢?

==============================

names = {"a" => 1,"b" => 2,"c" => 3}

for name in names

    print name,"\n"

end

==============================

输出是什么呢?a1,b2,c3,直接将键和值拼起来一块儿输出了。

ruby 的退出循环也比较奇怪。break和C系一样,C系的continue在ruby中叫next。注意,exit是退出整个程序,不是退出循环。

7) 迭代。 其实迭代也是我们熟悉的循环中的一种。和C第语言不同的是,对于复杂数据类型,比如数组,我们使用的不是for(var i=0,n=arr.leng;i<n,i++){}的形式,而是使用each方法。很眼熟吧?没错了,现在的js库里几乎都封装了each方法,不用再频繁地使用for了,直接each就可以完成迭代了。和js不同的是,each是ruby原生就支持的方法。

===============================

#数组

name = ["a","b","c"]

name.each{| n |

   print n,"\n"

}

#hash

a = {"name" => "adang" , "sex" => "male"}

a.each{| key , value |

   print key , " : " , value , "\n"

}

===============================

8) hash。 ruby也支持hash数据。和js不同的是,js的hash格式是{name1 : value1 , name2 : value2},而ruby的hash格式不是用:分隔,而是=>,这种使用习惯更像php。在调用hash数据时,js可以通过hash[name],或者hash.name的方式调用,而ruby只能通过hash[name]调用。

==============================

a = {"name" => "adang","sex" => "male"}

print a["name"]

==============================

9) 数组。 ruby的数组和js没太大区别,也可以通过 a = [] 来快速定义一个数组,有点奇怪的是ruby中数组长度不是通过arr.length来获得的,而是通过arr.size,这里size不是属性而是方法。

10) 正则。 和js一样,ruby的正则也可以通过/abc/的形式创建,但它的匹配方法和js不同,js中最常用的匹配方法是test,/abc/.test(str)是最常用的方式。在ruby中,匹配是通过 =~ 运算符来实现的,如果匹配成功,返回索引值,如果匹配失败,返回空值nil。nil应该相当于js中的null了:

==============================

p /Ruby/ =~ "Ruby"    #=> 0

p /Ruby/ =~ "Diamond" #=> nil

==============================

11) ARGV数组。 这个数组是用来保存命令行对指令脚本传入的实参,类似于js中的augments数组。

12)读取文件。 读取文件的方式和php有点像,也是先打开文件,然后读取内容,最后关闭文件。

==============================

#整篇读取

filename = ARGV[0]

file = open(filename)

text = file.read

print text

file.close

#结合正则表达式,逐行读取 (我怎么看着这么像读取数据库中的数据的形式呢?)

pattern = Regexp.new(ARGV[0])

filename = ARGV[1]

file = open(filename)

while text = file.gets do

   if pattern =~ text

       print text

    end

end

file.close

==============================

13) 将输出保存到文件中。 ruby比起js可以做更多的事了,比如说,读取或输出文本到文件,在ruby中将输出结果存在文件里非常简单,执行程序的时候,在指令的后面加上 “>文件名”,则输出就会被存在文件里。

==============================

> ruby test.rb > test.html

==============================

14) require。 像大多数语言一样(js除外),ruby支持require,需要被require的文件只需要被 require "fileName“就可以被包含进来了,值得注意的是,fileName可以省掉".rb"后辍。

15) 全局变量和局部变量。 js的全局变量和局部变量是通过var关键字结合函数作用域实现的,在ruby中,是通过$符号来区别全局变量和局部变量的。比如说a.rb和b.rb同时都定义了$str和str两个变量,a.rb里require了b.rb文件,那么b.rb中的$str会影响到a.rb文件,因为他们是同一个变量,而b.rb中的str不会影响到a.rb中的str。

16)==,eql和equal。 在ruby中所有的对象都持有身份标识(ID),它是ruby原生支持的。这让我想起YUI了,YUI中也会自动对对象生成ID作为身份标识,不仅是DOM对象,也包括程序中的对象,这点和ruby异曲同工,只是ruby原生就支持,通过object_id可以获得。

==============================

ary1 = []

p ary1.object_id #=> 67653636

==============================

判断两个给定的对象是不是同一对象(ID相同),可以通过equal?方法来进行判断。

==============================

str1 = "foo"

str2 = str1

str3 = "f" + ”o“ + "o"

p str1.equal?(str2)   #=> true

p str1.equal?(str3)   #=> false

==============================

在这里有个概念需要清楚,在ruby中,一切数据都是对象,"foo"在这里是作为一个对象存在的,这点和as3一样,str2 = str1这一步的时候,其实不是复制了一份"foo”字符传给了str2,而是直接将str1的址传给了str2,此时str1和str2指向的是同一个内存地址,这么设计的目的当然是为了节约内存。equal?()比较的应该是内存地址是否一致,而不是“值”是否一致。在js中,传值还是传址,是根据数据类型决定的,赋值时无法指定,string,num等等基本类型是传值,array,hash等复杂类型是传址。php里传值还是传址是通过有无&符号决定的,有&传址,无&传值。ruby里只会传址,不会传值。但和as3一样,虽然是传址,但其实它不是普通的传址,而是传的一种“不变对象”,当“不变对象”的值被改动的时,其实并不是改变“不变对象”本身,而是新生成一个不变对象,而将旧的不变对象由垃圾回收机制自动回收。关于这一点,可以参考黑羽的《action script3殿堂之路》第21页“基元数据类型的深入讨论”。

前面说的是“址”的比较,对于“值”的比较,ruby提供了==和eql方法,==和eql之间的关系就相当于js中的==和===关系。

==============================

p 1.0 == 1 #=> true

p 1.0 eql?1 #=> false

==============================

原文地址:https://www.cnblogs.com/cly84920/p/4426925.html