zoukankan      html  css  js  c++  java
  • 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

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

  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426924.html
Copyright © 2011-2022 走看看