• 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

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

  • 相关阅读:
    设计模式01之 简单工厂模式(创建模式)
    UML系列05之 基本流程图
    UML系列04之 UML时序图
    UML系列03之 UML类图(二)
    UML系列02之 UML类图(一)
    LaTex in Markdown
    Ubuntu18.04 下的Gif录制工具
    Python3 与 C# 扩展之~基础衍生
    Python3 与 C# 扩展之~模块专栏
    Python3 与 C# 面向对象之~异常相关
  • 原文地址:https://www.cnblogs.com/cly84920/p/4426924.html
Copyright © 2020-2023  润新知