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。 也就是说私有方法只能在当前对象的上下文中被调用。

 

时间: 2024-09-22 20:02:38

Ruby学习笔记-Method,Class的相关文章

ruby学习笔记(11)--symbol与hash参数

symbol是啥就不深入的讨论了,只简单说说symbol的好处 ruby内部对于每个对象,都会有一个数字id用来标识并区分,可以用xxx.object_id来查看 puts "0001".object_id puts "0001".object_id puts "0001".object_id puts "0001".object_id 输出结果类似如下: 32088750320887303208871032088690 可以

Ruby学习笔记_索引贴

学习Ruby也有段时间了,在学习的同时也做了些笔记并发到了园子睐.看到园子里的大虾们在出了一系列文章后都会做个索引贴,这样很方便,所以本人今天抽了个空就把它整理了下,方便自己的同时也方便感兴趣的朋友.   Ruby学习笔记目录: 1.Ruby入门 2.Ruby-循环与选择结构 3.Ruby-String 4.Ruby-Array 5.Ruby-Hash 6.Ruby-Block, Proc and Lambda 7.Ruby-正则表达式 8.Ruby-Symbol 9.Ruby-Method,C

ruby学习笔记(2)--类的基本使用

ruby语言跟c#的一些重要差别在于: 1.ruby是动态语言,c#是静态语言--即对象在new出来以后,ruby还可以动态给对象实例添加一些属性或方法(javascript也是如此) 2.ruby中刻意弱化了变量类型这个概念,默认情况下变量/方法都不需要声明具体(返回)类型,但其实在ruby内部,会自动根据变量的值分配类型.(可以通过 "puts 变量.class"查看) 3.ruby相对c#来讲,可能有些雷的地方在于:父类中的private成员,居然是可以在子类中使用的! ...其

Ruby学习笔记之Ruby 对象

大部分 Ruby 程序,它们的设计,逻辑,动作,都是围绕着对象进行的.写一个 Ruby 程序,主要的工作就是去创建对象,然后给它们能力,让它们可以去执行动作. Ruby 是 OOP 语言,就是面向对象的语言,你执行的计算,数据处理,输入与输出这些动作,都是通过创建对象,然后让这个对象去执行指定的动作来完成的.对象(object)在现实世界里,就是一个东西.一个苹果是一个对象,一张桌子也是一个对象. 每个对象是一个特定的类的实例(instance),对象的行为大部分是在它们所属的那个类上面定义的方

ruby学习笔记(3)--语法层面的先见之明

看了几天ruby,发现c#中很多一直被称道的语法特性,ruby早在几年前就有了:  1.c#中的params关键字 class Program { static void Main(string[] args) { Console.WriteLine(Sum()); Console.WriteLine(Sum(3,6)); Console.Read(); } static int Sum(params int[] nums) { int _result = 0; foreach (int ite

ruby学习笔记(1)--初识语法

虽然ruby/ruby on rails从2007年就一直获奖无数,但身为一个中国人,一直对小日本创造的东西不怎么感兴趣,想想其实也没必要,技术本身是无国界的,日本其实也有值得学习的地方(扯远了,呵) 单从技术而言,ruby本身确实很爽,令程序员的工作变得轻松有趣! 下面的代码演示了如何找出100以内的素数: using System; namespace Mersenne { class Program { static void Main(string[] args) { for (int

Ruby学习笔记之Ruby 模块

介绍一种跟类相似的构造:模块(module).在设计程序的时候,我们会把大的组件分割成小块,你可以混合与匹配对象的行为. 跟类差不多,模块也捆绑方法与常量.不一样的是,模块没有实例.你可以把拥有特定功能的模块放到类或某个特定的对象里使用. Class 这个类是 Module 类的一个子类,也就是所有的 class 对象应该也是一个 module 对象. 上午10:26 *** 创建与使用模块 上午10:26 *** module MyFirstModule   def say_hello   p

Ruby学习笔记

Ruby语言中,以对象为基本单位,可以说所有的元素都是对象.按照之前对于面向对象程序的理解,对象是指包含了特定属性和方法集合的一组程序.对象由类来定义,具体的表现为对象实例.也就是说,对象是类的实例化[2]. Ruby语言的基础元素 对象:数值对象.字符串对象.正则表达式对象.时间对象.文件对象.目录对象.数组.哈希.例外对象等 数值对象      由于Ruby中一切数据都是对象,所以我们处理的数字实际上也是对象.      a = 10,这样一个简单的赋值语句,实际上应当理解为 a = Num

Ruby学习笔记-Hash

l         哈希 1.创建哈希:就像创建数组一样,我们可以通过Hash类来创建一个Hash实例: h1 = Hash.new                                                  #默认值为nil h2 = Hash.new("This is my first hash instance")  #默认值为" This is my first hash instance": 上面两个例子都创建了一个空的Hash实例.