如何在鞋子中使用类

  • 本文关键字: ruby class object 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

我对 Shoes 不太熟悉,但你在这里可能遇到的问题是你试图在Post类上调用一个名为 para 的方法,但不存在这样的方法。

当您调用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 类。此时您有以下几种选择:

  1. 传入 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
    
  2. 创建一个接受 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
    
  3. 您可以使用 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,但你必须小心使用它,因为如果你滥用它,它会使代码难以遵循。

执行此操作

的一种更简单的方法是让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

相关内容

  • 没有找到相关文章

最新更新