• Ruby学习笔记Method,Class


    Method

    a)  定义:

      def 方法名 (参数)              #在ruby中方法的参数可以不加括号

             #do something

      end 

      注:方法名命名规则:以小写字母或者下划线开始,后边跟数字,字母和下划线,单词之间用下划隔开:

          def hello_world

                 puts “Hello world”

      end

      方法名后边可以跟=,  ?, !

      “=”: 表示该对象的参数可选,若调用时,没有参数,则使用默认的

      “?”: 表示该方法是查询功能的方法

      “!”: 修改接收对象的方法

    b) 方法参数:

      1.设定方法参数默认值:在定义方法时,可以为一些或全部参数指定默认值。在参数后加下等号和一个值,就可以为该参数指定一个默认值,如:

      def hello(name="ruby")

                 puts("Hello, #{name}")

      end

      hello()

      hello("world") 

      另外,参数的默认值不一定必须是常量,也可以是任意表达式,还可以是实例变量的引用,还可以是前面定义参数的引用。

           def hello(a=10,b=5,c=a-b)

                 puts a,b,c

      end

      hello()

      puts

      hello(1,2,10)

      2.可变长度参数列表:Ruby中接受任意数目的参数,要在某个参数前加上一个*号,在方法的代码中,这个参数表示成一个数组,它包含传给这个位置上的0个或多个参数。比如:

            def hello(first,*rest)

                  p first

                  p rest

       end

       hello("11","22","33","44","55")       

            注:在ruby1.9中,用*打头的参数要放在带有默认值参数的后面,其后可以再指定普通参数,但是该普通参数要放在&打头的参数之前。

            3.哈希表作为有名参数:如果一个方法的有多于两三个参数时,程序员很难记清楚参数的顺序,这时我们就可以使用哈希对像作为参数,如:

            def sequence(args)

                  m=args[:m]

                  c=args[:c]

                   n=args[:n]

                  a=[]

                  3.times{|i| a << m*i + c}

                  p a                 #=> [10, 15, 20]

       end

       sequence({:n=>3, :m=>5,:c=>10})        #调用方法,传递哈希对像      

           另外,如果哈希对象是最后一个参数(或后面只有一个用&打头的代码块参数),Ruby允许省略哈希字面量的大括号。 

       sequence(:n=>3, :m=>5,:c=>10)       

           因为Ruby中方法调用可以省略圆括号,所以也可以写成下面这样的形式: 

       sequence :n=>3, :m=>5,:c=>10      

           如果省略了圆括号,就必须省略大括号,否遇Ruby认为你传递了一个代码块给这个方法。

           4.代码块参数:在Ruby中每个方法调用都可以紧跟一个代码块,每个关联代码块的方法可以通过yield语句调用代码块中的代码。

      def hello(n,m,c)

          i=0

          while(i<n)

             yield i*m + c

             i+=1

         end

      end

      hello(3,2,1){|x| puts x} 

              代码块是匿名的,如果希望明确的来控制一个代码块,可以在方法最后加上一个参数,并用&做这个参数的前缀。这个参数会指向传给方法的代码块,该参数是一个Proc对象,它不使用yield语句调用,而是直接通过Proc的call方法来调用:

               def sequence(n,m,c,&b)

                  i=0

                  while(i<n)

                      b.call(i*m+c)

              i+=1

                 end

        end

        sequence(5,2,2){|x|puts x}

      或

             def sequence(n,m,c,b)

                  i=0

                  while(i<n)

                    b.call(i*m+c)

             i+=1

                 end

       end

       p=Proc.new{|x|puts x}

         sequence(5,2,2,p)} 

      注:用&打头的代码块参数必须是最后一个,这是为了与省略了括号的数组与哈希参数区别。

    c) 返回值

      方法代码的最后一个表达式的值会作为方法调用表达式的值返回。在Ruby中可使用return关键字显式返回表达式的值,当然也可以不使用return关键字,隐式返回表达式的值。 

    Class

    a)  定义

       class name

          def initialize (pram1, pram2, …)

                  @pram1 = pram1

                  @pram2 = pram2

                  …

          end

                  …

        end

      Note: 类名的首字母大写,后面的单词的首字母也大写;

      Initialize 方法如果不做定义,系统默认有一个initialize 方法,在实例化变量时无需给其参数;若用户自定义initialize方法后,实例化对象时就要按照该方法的格式实例化;

      Ruby中在实例嵌套类时,需要需要使用”外部类::嵌套类.new”的格式实例化潜逃类。

    b) 继承

      class  SubCalss < SuperClass

        ...

      end

    c)访问器方法和属性

      通俗版:

      class Test

             def initialize(x,y)

                    @x=x

                    @y=y

             end      

             def x; @x;end

             def y;@y; end 

             def  x=(value)

                    @x=value

             end 

             def  y=(value)

                    @y=value

             end

      end

       改进版:

      class Test

             attr_reader :x, :y

             #attr_accessor

             #attr_writer

      end

    d) 类方法

      在ruby中可以使用类名称直接访问的方法,称为类方法。有三种方法可以定义一个类方法;

           1)类名.方法名

           2) self.方法名 #(使用self的目的之一是:DRY, don’t repeat yourself)

           3)class << self

                    def 方法名

                         …

                    end

                         …

              end

    e) 类变量:

      在Ruby中,还可以定义类变量,类变量需要以”@@”开头,它属于某个类,所以在类的某个实例改变类变量时,将引起实例所属类的类变量发生改变。即一旦类变量发生改变,所有实例调用的类变量都会发生改变。类变量使用之前一定要初始化;

    f) 访问控制

      Public 可以被任何实例化对象调用,没有限制访问访问控制。方法默认是public,initialize除外,默认为private. 另外一个例外是所有在类外定义的”全局”方法,这些方法被定义为Object对象的私有实例方法

      Protected 只能被定义了该方法类或其子类对象调用。整个家族均可访问。

      Private 不能对象直接调用,接收者只能是self。 也就是说私有方法只能在当前对象的上下文中被调用。

  • 相关阅读:
    PHP序列化和反序列化
    移动端纯css超出盒子出现横向滚动条
    css3盒子flex
    css怎么设置2个div同行,第一个固定宽度,第二个占满剩余的部分
    PHP对象基础
    常用header头
    【转载】文件上传那些事儿,文件ajax无刷上传
    简单工厂模式(Simple Factory Pattern)
    单例模式(singleton)
    UML类图
  • 原文地址:https://www.cnblogs.com/puresoul/p/2327784.html
Copyright © 2020-2023  润新知