Spring 2.0+ JRuby 快速入门三(调用方法)

本文介绍如何在Ruby中定义和调用方法及类,包括方法的调用方式、类的定义与使用、实例变量的访问控制及类的动态调整等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用方法

  在定义好方法后,下面我们来调用这些方法:

irb(main):032:0> greeting_1
How are you!
=> nil
irb(main):034:0> greeting_2("Tom")
How are you,Tom
=> nil
irb(main):035:0> greeting_3
How are you,John
=> nil

  对于没有入参的方法来说,可以直接不带括号进行调用。对于有默认值的入参可以不提供参数值。

  定义类

  下面的代码定义了一个具有两个方法的Waiter类:

irb(main):004:0> class Waiter
irb(main):005:1> def initialize(name="Sir")
irb(main):006:2> @name = name
irb(main):007:2> end
irb(main):008:1> def greeting
irb(main):009:2>攀?畱瑯?? ?o??ū puts "How are you,#{@name}"
irb(main):010:2> end
irb(main):011:1> def send_off
irb(main):012:2> puts "Byebye #{@name}"
irb(main):013:2> end
irb(main):014:1> end

  @name中的@是新出现的关键字,表示定义一个实例变量,实例变量可以被类中的所有方法引用。

  使用类

  如何调用刚才定义的Waiter,并让它真正工作起来呢?我们马上着手做这样的工作:

irb(main):015:0> Waiter.new("Miss")
=> #<Waiter:0xdbd3a14 @name="Miss">
irb(main):016:0> w = Waiter.new("Miss")
=> #<Waiter:0xdbd0d8c @name="Miss">
irb(main):017:0> w.greeting
How are you,Miss
=> nil

  但你不能通过g.name引用实例变量,Ruby允许你随时改变类的定义,下面的代码让name实例变量对外可见。

  类的动态调整

  通过下面的代码,改变Waiter类的结构定义,让name实例变量对外可见:

irb(main):024:0> class Waiter
irb(main):025:1> attr_ACCESSor :name
irb(main):026:1> end
=> nil
irb(main):027:0> w = Waiter.new("Miss")
=> #<Waiter:0xdbba230 @name="Miss">
irb(main):028:0> w.name
=> "Miss"


  在Ruby语言中,你能够多次修改某个类,而修改所带来的变化自动对后面的调用生效。我们通过使用attr_ACCESSor使name属性对外可见,相当于在Java中将private调整为public。动态语言的灵活性之一表现在程序的过程中可以调整程序本身,甚至在程序中创建另外一段程序并动态进行执行。所以有人说,不管是大师还是一般的开发者使用Java编写的程序在结构上都不会有太大的差别,但大师和一般开发者用动态语言编写的代码却可能有着天壤之别。

  将类保存为类文件

  前面的例子都以交互的方式操作代码,代码不能够在其它类中重用。如果希望多次使用同一个类,则需要将代码保存到文件中。你可以通过开始->程序->Ruby-xxx-yyy->SciTE打开可以编写Ruby程序文件的编辑器,如下图所示:

按此在新窗口浏览图片

图 2 SciTE编辑器

  下面的例子编写了一个Waiter类,并最终将其保存到Waiter.rb类文件中:

# This is a simple example ①使用#进行注释
class Waiter
 attr_ACCESSor :names
 def initialize(names = "Mr.")
 @names = names
end
def greeting
if @names.nil? ②@names是否为空
 puts "..."
elsif @names.respond_to?("each"攀?畱瑯?? ?o??ū) ③如果@names对象具有each方法,那么进行迭代
 @names.each do |name| ④
 puts "How are you! #{name}"
 end
else
 puts "How are you #{@names}"
 end
end
end
if __FILE__ == $0 ⑤
 w = Waiter.new
 w.greeting

 w.names ="Mr. John"
 w.greeting

 w.names =["Mr.John","Cliton Miss","Mr. Tomson"]
 w.greeting
end


  ④处的each是一种方法,它接受一个代码块,然后针对列表中的每个成员执行这个代码块,而在do和end之间的部分便是类似于Java匿名类的代码块。在竖杠之间的变量是代码块的参数name,它作为代码块参数被绑定为列表成员。而代码块puts "How are you! #{name}"将使用这个参数进行输出。

  ⑤部分的代码是对前面定义类的调用,__FILE__是一个特殊的变量,它代表了当前文件名。$0是启动程序的文件名。那么代码“if __FILE__ == $0”意味着检查此文件是否为将被使用的主程序文件。这样做可以使程序文件作为程序库使用,而不是可执行代码;但当此文件被用作执行文件时,也可被执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值