美文网首页
Ruby学习基础(一) — 方法

Ruby学习基础(一) — 方法

作者: xautjzd | 来源:发表于2013-05-28 11:39 被阅读168次
    • 方法调用
      方法的调用方式如下:
      obj.method
      obj::method
      上面两种方式都可,但一般主要采取第一种方式。
      同时在不产生歧义的条件下可以省略括号

    • 可变的参数列

    def methodname(a, b, *c)
          p [a, b, c]
    end
    methodname(1, 2, 3, 4, 5)   #=>[1, 2, [3, 4, 5]]
    

    多出的实际参数会保存在数组中,然后赋给带有*的参数

    注:Ruby1.8中,可变参数必须是形参的最后一个,而Ruby1.9中则无位置及次数的限制

    • 带有代码块的方法
      调用带有代码块的方法主要作用有以下几点:
      1) 循环的抽象化
      2) 增加代码块的功能。典型的例子是资源管理
      3)回调函数与事件处理器(event handler)

    • 代码块参数与代码块局部变量
      代码块参数与代码块局部变量相互独立,互不影响。eg:

    x = 10
    (1..5).each{|i| x +=i}
    p x           #=>25
    
    x=10
    (1..5).each{|x| p x += 1 }
    p x        #=>10
    

    注: 已经传给代码块外部出现过的局部变量,在代码块内部也可以同样使用(闭包)。

    • yield
    def test
          yield "hello"
          yield "world"
          yield "xautjzd"
    end
    test do |item|
          puts item
    end
    \#=>hello
    \#  world
    \#  xautjzd
    
    • Proc
      其实代码块也可以作为一个变量来处理。有时候可能会需要将得到的代码块带入变量或作为其他方法的参数进行传递。这种情况下,则必须在形式参数列的最后加上一个用&修饰的参数(比可变参数还靠后的最后位置),这样调用者所传递的Proc对象(即代码块)便被保存在这个参数中。 eg:
    class PlayGames
           def register_handler(&handler)
                 @event_handler = handler
           end
           def play
                 @event_handler.call Time.now, "playing"
            end
    end
    xautjzd = PlayGames.new
    xautjzd.register_handler {|time, message| p message, " at ", time}
    xautjzd.play
    

    Proc对象是将代码块看做对象时的名字。在实际调用带有代码块的方法过程中,可以将传递的代码块替换成Proc对象,当然需要用&进行修饰,将其放在参数列的最后。eg:

    proc = Proc.new {puts "proc is called"}
    3.times(&proc)
    \#=> proc is called
    \#   proc is called
    \#   proc is called
    
    • 类方法
      类方法的三种定义方式:
      1)类名.方法名
    class HelloWorld
      def HelloWorld.hello(name)
        print name, " said Hello."
      end
    end
    HelloWorld.hello("xautjzd")   #=>xautjzd said hello.
    

    2)class<<类名

    class HelloWorld
      .
      .
    end
    class << HelloWorld
      def hello(name)
        print name, " said hello."
      end
    end
    HelloWorld.hello("xautjzd")  #=>xautjzd said hello.
    

    3)self.methodname

    class HelloWorld
      def self.hello(name)
        print name, " said hello"   
      end
    end
    HelloWorld.hello("xautjzd")    #=>xaujtzd said hello.
    
    • attr_accessor定义类变量
      其实attr_accessor也可以用于定义类变量的getter和setter方法,eg:
    class Test
       class << self
          attr_accessor :count
       end
    end
    Test.count =5
    puts Test.count
    

    相关文章

      网友评论

          本文标题:Ruby学习基础(一) — 方法

          本文链接:https://www.haomeiwen.com/subject/njhxtttx.html