我是一名初学程序员,有使用Processing的背景知识。我目前正在尝试使用Shoes制作应用,但我对对象和类的工作方式感到困惑。
我知道以下内容将在Ruby中运行:
class Post
def self.print_author
puts "The author of all posts is Jimmy"
end
end
Post.print_author
但为什么以后会在鞋子中获胜呢?我该如何让它运行?
class Post
def self.print_author
para "The author of all posts is Jimmy"
end
end
Shoes.app do
Post.print_author
end
答案 0 :(得分:5)
我对鞋子不太熟悉,但您可能遇到的问题是您尝试在para
上调用名为Post
的方法类,并没有这样的方法。
当您致电Shoes.app do ...
时,我怀疑Shoes正在将当前执行上下文更改为包含这些方法的上下文。也就是说,您应该期望这样做:
Shoes.app do
para "The author of all posts is Jimmy"
end
这相当于:
Shoes.app do
self.para("The author of all posts is Jimmy")
end
当您致电Post.print_author
时,self
不再是Shoes对象,而是Post类。那时你有几个选择:
传递Shoes实例,并在其上调用特定于Shoes的方法。当你不需要Post中的任何州时,你应该这样做:
class Post
def self.print_author(shoes)
shoes.para "The author of all posts is Jimmy"
end
end
Shoes.app do
Post.print_author(self)
end
创建一个接受Shoes对象的Post类,这样你就不必继续传递它。如果Post有大量的状态,你应该这样做:
class Post
def initialize(shoes)
@shoes = shoes
end
def print_author
@shoes.para "The author of all posts is Jimmy"
end
end
Shoes.app do
post = Post.new(self)
post.print_author
end
您可以在2.选项上使用变量来自动将调用传递给@shoes
对象。这开始进入Ruby元编程,我建议你避免,直到你对Ruby更加舒服,但是我把它留在这里引起你的兴趣:
class Post
def initialize(shoes)
@shoes = shoes
end
def print_author
para "The author of all posts is Jimmy"
end
def method_missing(method, *args, &block)
@shoes.send(method, *args, &block)
end
end
Shoes.app do
post = Post.new(self)
post.print_author
end
这样做是告诉Ruby"如果在Post实例上找不到方法,请尝试将其发送到@shoes实例"。你可以想象,这可以允许一些非常好的DSL,但你必须小心使用它,因为如果你滥用它可能会使代码难以理解。
答案 1 :(得分:0)
更简单的方法是让Post
提供内容,然后在您的Shoes应用中,根据需要呈现该内容。附带好处:您可以在另一个打印到控制台的类中重复使用Post类。
class Post
def self.print_author
"The author of all posts is Jimmy"
end
end
Shoes.app do
para Post.print_author
end
class ConsoleApp
def run
puts Post.print_author
end
end