Rec*_*ner 3 ruby shoes class object
我是一个有点初学者的程序员,有使用Processing的背景.我目前正在尝试使用Shoes创建一个应用程序,但我对于对象和类如何工作感到困惑.
我知道以下内容将在Ruby中运行:
class Post
def self.print_author
puts "The author of all posts is Jimmy"
end
end
Post.print_author
Run Code Online (Sandbox Code Playgroud)
但为什么以下不会在鞋子中运行?我怎么让它运行?
class Post
def self.print_author
para "The author of all posts is Jimmy"
end
end
Shoes.app do
Post.print_author
end
Run Code Online (Sandbox Code Playgroud)
我对Shoes并不太熟悉,但你可能遇到的问题是你正在尝试调用类para上调用的方法Post,并且不存在这样的方法.
当你打电话时Shoes.app do ...,我怀疑Shoes正在将当前执行上下文更改为包含这些方法的上下文.也就是说,你应该期望这个工作:
Shoes.app do
para "The author of all posts is Jimmy"
end
Run Code Online (Sandbox Code Playgroud)
这相当于:
Shoes.app do
self.para("The author of all posts is Jimmy")
end
Run Code Online (Sandbox Code Playgroud)
当你调用时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
Run Code Online (Sandbox Code Playgroud)创建一个接受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
Run Code Online (Sandbox Code Playgroud)您可以在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
Run Code Online (Sandbox Code Playgroud)这样做是告诉Ruby"如果在Post实例上找不到方法,请尝试将其发送到@shoes实例".您可以想象,这可以允许一些非常好的DSL,但您必须小心使用它,因为如果您滥用它可能会使代码难以遵循.
| 归档时间: |
|
| 查看次数: |
674 次 |
| 最近记录: |