如果我们想说很多次“Hello”而不让手指感到疲劳怎么办?我们需要定义一个方法!
irb(main):010:0> def hi
irb(main):011:1> puts "Hello World!"
irb(main):012:1> end
=> :hi
代码 def hi
开始定义方法。它告诉 Ruby 我们正在定义一个方法,它的名字是 hi
。下一行是方法的主体,与我们之前看到的那行相同:puts "Hello World"
。最后,最后一行 end
告诉 Ruby 我们已经完成了方法的定义。Ruby 的响应 => :hi
告诉我们它知道我们已经完成了方法的定义。对于 Ruby 2.0 及更早版本,此响应可能是 => nil
。但是,这在这里并不重要,所以我们继续。
方法简短而重复的生命
现在让我们尝试运行几次该方法
irb(main):013:0> hi
Hello World!
=> nil
irb(main):014:0> hi()
Hello World!
=> nil
嗯,这很简单。在 Ruby 中调用方法就像向 Ruby 提及它的名字一样简单。如果该方法不接受参数,那么这就是您所需要的。您可以添加空括号(如果需要),但不是必须的。
如果我们想向一个人说 hello,而不是向全世界说 hello 怎么办?只需重新定义 hi
以接受一个名称作为参数即可。
irb(main):015:0> def hi(name)
irb(main):016:1> puts "Hello #{name}!"
irb(main):017:1> end
=> :hi
irb(main):018:0> hi("Matz")
Hello Matz!
=> nil
所以它工作了……但让我们花点时间看看这里发生了什么。
在字符串中占位
#{name}
这部分是什么?这是 Ruby 将某些内容插入到字符串中的方式。花括号之间的部分被转换为字符串(如果它还不是字符串),然后在该点替换到外部字符串中。您也可以使用它来确保某人的名字正确地大写
irb(main):019:0> def hi(name = "World")
irb(main):020:1> puts "Hello #{name.capitalize}!"
irb(main):021:1> end
=> :hi
irb(main):022:0> hi "chris"
Hello Chris!
=> nil
irb(main):023:0> hi
Hello World!
=> nil
这里还有一些其他技巧需要注意。一个是我们再次在没有括号的情况下调用该方法。如果您所做的事情很明显,则括号是可选的。另一个技巧是默认参数 World
。它的意思是“如果未提供名称,则使用默认名称 "World"
”。
进化为问候者
如果我们想要一个真正的问候者,一个会记住你的名字、欢迎你并且总是尊重你的人。您可能需要为此使用一个对象。让我们创建一个“Greeter”类。
irb(main):024:0> class Greeter
irb(main):025:1> def initialize(name = "World")
irb(main):026:2> @name = name
irb(main):027:2> end
irb(main):028:1> def say_hi
irb(main):029:2> puts "Hi #{@name}!"
irb(main):030:2> end
irb(main):031:1> def say_bye
irb(main):032:2> puts "Bye #{@name}, come back soon."
irb(main):033:2> end
irb(main):034:1> end
=> :say_bye
这里的新关键字是 class
。这定义了一个名为 Greeter 的新类以及该类的一系列方法。还要注意 @name
。这是一个实例变量,并且可用于该类的所有方法。正如您所看到的,它被 say_hi
和 say_bye
使用。
那么我们如何让这个 Greeter 类开始工作呢?创建一个对象。