我是一个有点初级程序员谁有使用处理的背景。我正在尝试制作一个带鞋子的应用程序,但是我对对象和类的工作方式感到困惑。
我知道以下操作将在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
最佳答案
我不太熟悉shoes,但您可能遇到的问题是,您试图在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
创建一个post类,它接受一个shoes对象,这样就不必一直传递它了。如果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,但是您必须小心使用它,因为如果您滥用它,可能会使代码难以遵循。