现在我们创建一个Greeter对象来来调用它
当对象g被创建后,它就记下name的值为Pat,嗯……,如果我们想直接取得name呢
irb显示错误信息,所以我们不能这样做!
对象内部
实例变量隐藏在对象内部,但他们隐藏得不是十分隐蔽,你可以随时看到它们当你检查对象的时候,有几个方法去访问它们。Ruby提供了很好的对象导向去接近它们并保持着数据隐藏在远处。
那么有那些方法存在对象Greeter中?
喔~,这里有好多方法,但我们只定义了两个方法,这里是怎么回事呢?这是对象Greeter的全部方法,一个完整的列表,包含了父类定义的一些方法。如果要列出定义在Greeter中的且不包含父类的方法,那就使用参数false:
嗯,这就对了,那我们看看对象g对哪些方法有响应
更改类
但如果你想要查看name的值的变化呢?Ruby提供了一个简单的方法访问对象的变量:
在Ruby中,你可以打开一个类修改它,并不是修改任何已经存在的对象,只是影响你新创建的任何对象。我们试试创建一个新对象,看看它的@name属性:
使用attr_accessor定义两个新方法:name用来获取值,name=用来赋值。
问候世间万物,无敌百万Greeter!
这个Greeter并不是如标题那样有趣,它一次只能处理一个人。如果我们有一种可以问候世界、某人、一个列表中的人的Greeter呢?让我们在一个文件中写一个这样的Greeter.退出IRB可以输入"quit" "exit"或者按ctrl+D。
class MegaGreeter
attr_accessor :names
# Create the object
def initialize(names = "World")
@names = names
end
# Say hi to everybody
def say_hi
if @names.nil?
puts "..."
elsif @names.respond_to?("each")
# @names is a list of some kind, iterate!
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end
# Say bye to everybody
def say_bye
if @names.nil?
puts "..."
elsif @names.respond_to?("join")
# Join the list elements with commas
puts "Goodbye #{@names.join(", ")}. Come back soon!"
else
puts "Goodbye #{@names}. Come back soon!"
end
end
end
if __FILE__ == $0
mg = MegaGreeter.new
mg.say_hi
mg.say_bye
# Change name to be "Zeke"
mg.names = "Zeke"
mg.say_hi
mg.say_bye
# Change the name to an array of names
mg.names = ["Albert", "Brenda", "Charles",
"Dave", "Englebert"]
mg.say_hi
mg.say_bye
# Change to nil
mg.names = nil
mg.say_hi
mg.say_bye
end
(文中代码颜色加亮不正确是因为没有插入Ruby语言的选项,所以使用PHP代替)
文件另存为ruby20min.rb,在CMD中进入ruby20min.rb所在位置,输入ruby ruby20min.rb
输出的结果应该是
Goodbye World. Come back soon!
Hello Zeke!
Goodbye Zeke. Come back soon!
Hello Albert!
Hello Brenda!
Hello Charles!
Hello Dave!
Hello Englebert!
Goodbye Albert, Brenda, Charles, Dave, Englebert. Come
back soon!
...
...
接下来,请看第四部分