1.8Ruby语言的方法(Method)

1.方法的定义

方法遵循标识符的命名规则,全小写,多单词加下划线。

def 方法名(形参1, 默认形参2 = 值, *数组形参, &代码块形参)
  .
  .
  希望执行的处理
  .
  局部变量(可选)
  .
end

2.方法分类

2.1类方法

接收者不是对象而是类本身的方法。

#用单键方法的方式定义类方法
class 类名
  def self.类方法
  end
end
#类方法的调用
类.类方法(实参1,实参2,···,实参n) 

2.2实例方法

以对象为接收者的方法。

#实例方法的定义
class 类名
  def 实例方法
  end
end
#实例方法的调用
对象.实例方法(实参1,实参2,···,实参n)

上面的对象被称为接收者(receiver)。调用方法被称为“向对象发送消息(message)”,调用的结果是“对象接收(receive)了消息”。也就是说,方法的调用就是把几个参数组成的消息一起发送给对象的过程。

2.3函数式方法

没有接收者的方法。

class HelloWorld                        # class语句
  def initialize(myname = "Ruby")       # initialize方法
    @name = myname                      #初始化实例变量
  end

  def hello                             #实例方法
    puts "Hello,world.I am #{@name}."   #puts为函数式方法
  end

bob = HelloWorld.new("Bob")             #new为类方法
bob.hello

3.参数分类

名称修饰符
值参数
默认值参数
数组参数用 * 修饰
代码块参数用 & 修饰

4.参数传递方式

方法的参数顺序必须依次为:形参,有默认值的形参,*数组形参(任意数量的参数),&代码块形参(代码块作为对象)。

由于形参是实参的规范,所以实参的数量和类型需与形参一致。

参数的传递不仅支持按位置从左往右依次传递方式,不支持按命名参数传递方式(可通过哈希对象实现近似功能)。

5.重写(Override)

当一个子类从父类继承的时候,可以在子类定义与父类同名的方法来覆盖父类的方法,以达到方法重写的功能。

class WorldGreeter
  def greet
    puts "#{greeting} #{who}"
  end

  def greeting
    "Hello"
  end

  def who
    "World"
  end
end
class SpanishWorldGreeter < WorldGreeter
  def greeting
    "Hola"
  end
end
SpanishWorldGreeter.new.greet   #Hola World

6.方法的可见性

方法的可见性可以是公开(public)、私有(private)、被保护(protected)。

如果没有明确声明为private或protected,方法默认的可见性是public。

一个例外是initialize方法,它总是默认为private。还有一个例外,就是所有在类外定义的“全局”方法,虽然是Object的private方法,但是可以在任何地方被调用,相当于public。

私有(private)方法可以被类(或子类)的实例方法调用,只能通过隐性的接收者调用,不可以直接通过对象o.m或self.m显性调用。

方法可见性publicprivate
对象显性调用可以不可以
对象隐性调用可以可以
子类继承超类可以可以
子类对象显性调用可以不可以
子类对象隐性调用可以可以

7.带符号的方法

方法后的符号不可省略,因为有时候同一个类会有两个名字一样的方法

=(赋值方法)

比如一个对象o有一个叫做x=的方法,下面两种写法所做的事情是一样的

o.x=(1)    #常规写法
o.x = 1    #复制写法

?(断言方法)

用于返回Boolean值(Ruby没有Boolean类)的方法

empty?

!(可变方法)

告诉开发者使用此方法时要多加小心

sort!

8.递归方法

在方法代码体中调用方法自身,这种方法被成为递归方法。

def factorial(n)
  if n < 1
    raise "argument must be > 0"
  elsif n == 1
    1
  else
    n*factorial(n-1)
  end
end

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/ruby/rubylang/1545.html

(0)
上一篇 2020年7月7日 04:30
下一篇 2020年7月9日 02:30

相关推荐

  • 1.9Ruby语言的块(Block)以及带块的方法

    块 又被称为 代码块 ,位于do~end(包括do和end关键字)或者花括弧{~}(包括花括弧)中间的代码就是 代码块 。代码块不可单独存在,只有出现在一个方法调用之后才是合法的。 程序的控制流首先执行方法,当遇到yield时,控制流会从方法转移到那个与方法调用相关联的代码块中,当程序执行完代码块之后,方法重新获得控制…

    Ruby语言教程 2020年7月9日
    01.0K0
  • 1.3Ruby语言的非操作符(Nonoperator)和操作符(Operator)

    非操作符 Ruby语言包括11个非操作符:圆括号(( ))、方括号([ ])、花括号( { })、圆点(.)、逗号(,)、分号(;)、冒号(:)、双冒号(::)、箭头(=>)、星号(*)、与(&)、小于(<)。 操作符 操作符,又称为运算符。有一个操作数的操作符称为一元操作符,有二个操作数的操作符称…

    Ruby语言教程 2020年7月3日
    01.4K0
  • 2.4Ruby语言的反射(Reflection)

    反射(Reflection) 也称为 内省(introspection) ,表示一个程序可以审视自身的状态和结构。比如, 返回对象o的类 返回类c的超类

    Ruby语言教程 2020年8月4日
    04310

发表回复

登录后才能评论