我是一个有点初级程序员谁有使用处理的背景。我正在尝试制作一个带鞋子的应用程序,但是我对对象和类的工作方式感到困惑。
我知道以下操作将在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,但是您必须小心使用它,因为如果您滥用它,可能会使代码难以遵循。

10-08 02:21