当前位置: 首页 > 编程笔记 >

ruby声明式语法的实现例子

薛阳荣
2023-03-14
本文向大家介绍ruby声明式语法的实现例子,包括了ruby声明式语法的实现例子的使用技巧和注意事项,需要的朋友参考一下

在ActiveRecord可以用很方便的声明方式来定义model之间的关联关系,例如:


class Topic < ActiveRecord::Base

  has_many :posts

  belongs_to :user

end

has_many和belongs_to其实是Topic类的class method,标准写法是:


class Topic < ActiveRecord::Base

  Topic.has_many(:posts)

  Topic.belongs_to(:user)

end

那么has_many可以给我们带来什么呢?类方法has_many在被执行的时候,给Topic的对象实例添加了一系列方法:posts, posts<<, orders.push......等等。所以当我们在model里面声明has_many,belongs_to等对象关系的时候,一系列相关的对象方法就被自动添加进来了。 让我们来自己试试看吧:


module M

  def self.included(c)

    c.extend(G)

  end

  module G

    def generate_method(*args)

      args.each do |method_name|

        define_method(method_name) { puts method_name }

      end

    end

end

end

class C   include M   generate_method :method1, :method2 end

c = C.new c.method1 c.method2

我们定义了一个声明generate_method,可以接受多个symbol,来动态的创建同名的方法。现在我们在类C里面使用这个声明:generate_method :method1, :method2,当然我们需要include模块M。为什么ActiveRecord的model不需要include相关的模块呢?当然是因为Topic的父类ActiveRecord::Base已经include了模块Associations了。

类C通过include模块M,调用了模块M的一个included回调接口,让类C去extend模块G,换句话来说就是,通过include模块M,来给类C动态添加一个类方法generate_method。

这个generate_method被定义在模块G当中,它接受一系列参数,来动态创建相关的方法。于是我们就实现了这样的DSL功能:

通过在类C里面声明generate_method :method1, :method2,让类C动态的添加了两个实例方法method1,method2,是不是很有意思? 实际上rails的对象关联声明也是以同样的方式实现的。

 类似资料:
  • SwiftUI 是声明式语法,对比与指令式语法的话,可以举例说明它们的区别吗?

  • 问题内容: 我刚刚开始学习语言,但仍在尝试消化一些东西。 我写了一个函数为: 我真的很困惑或由于缺乏知识而无法理解的用例 。 问题答案: 我在“ 您可以在Go中一次声明多个变量吗? ”中提到过:解释了。 但是您需要具有与函数的每个参数相关联的类型,而上一个参数列表中并非如此。 顺序始终是,而不是遵循变量声明规范: 你会总能找到一个类型 后 一个:或

  • 我是第一次使用Qt-6,对C++比较业余。我看到了这种类型的类声明,但不理解它的含义。 这叫什么?谁能解释一下这是什么或者指出相关的材料/问题。

  • 本文向大家介绍Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例,包括了Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Spring实战之使用TransactionProxyFactoryBean实现声明式事务操作。分享给大家供大家参考,具体如下

  • 问题内容: 对我的头衔表示歉意,我无法正确表达问题。 我已经看到有两种实现方式。首先通过表示您的类已实现来完成。第二个任务是让您自己声明完成任务。 为什么在第一种选择中,您可以简单地将其作为参数,而在第二种选择中,则必须麻烦自己创建对象? 首先: 第二: 问题答案: 在第一种方法中, 整个Activity类都 实现了该接口。您可以将每个View的设置 为此 ,并通过一种方法接收所有click事件,

  • JSP 声明语句用于声明一个或多个变量、方法,以供后面的 Java 代码使用。您必须先对变量和方法进行声明,才能使用它们。 JSP 声明语法如下: <%! 声明语句 %> 等效于 示例 JSP脚本和声明的区别 JSP 脚本只能声明变量,不能声明方法。JSP 声明语句可以声明变量和方法。 JSP 脚本会把包含的内容转译插入到 Servlet 的 service() 方法中,也就是  中定义的变量是局