gpt4 book ai didi

ruby - 如何在 Shoes 中使用类?

转载 作者:数据小太阳 更新时间:2023-10-29 07:52:34 24 4
gpt4 key购买 nike

我是一个有点初学者的程序员,有使用 Processing 的背景。我目前正在尝试使用 Shoes 制作应用程序,但我对对象和类的工作方式感到困惑。

我知道以下将在 Ruby 中运行:

class Post
def self.print_author
puts "The author of all posts is Jimmy"
end
end

Post.print_author

但为什么下面的代码不能在 Shoes 中运行?我如何让它运行?

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,但您必须小心使用它,因为如果滥用它会使代码难以理解。

关于ruby - 如何在 Shoes 中使用类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26982986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com