首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将代码注入ruby状态机?

将代码注入ruby状态机?
EN

Stack Overflow用户
提问于 2012-08-27 22:23:51
回答 1查看 642关注 0票数 3

我想用猴子补丁插件周状态机(https://github.com/pluginaweek/state_machine),这样我就可以把代码从mixin模块注入到状态机中。有人知道如何在状态机中定义一个新方法来实现这一点吗?或者,也许有一种更好的方法来完成我想要完成的事情?

假设,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Artifact < ActiveRecord::Base
  include Provisionable # << This module makes the magic method 'provision',
                        # << below, available

  state_machine :machine_state, :initial => :s_initial do
    # ...
    provision(:param1, :param2, :param3) # << The Question: how to define
                                         # << this in the Provisionable mixin
                                         # << module, below
    ...
  end
...
end

module Provisionable
  #
  # << provision() is supposed to inject the desired code into the state machine:
  #
  def provision

    # << Code sample to be injected begins here:
    event :parameterize do
      transition :s_unprovisioned => :s_initial
    end
    before_transition :s_unprovisioned => :s_initial do |artifact, transition|
      transition.args.each_pair do |param, value|
        # etc...
      end
    end
    # >> Code to be injected ends here.

  end
end

对于那些购买状态机的人,我强烈推荐这个。

谢谢!

后来补充道:我找到了一个解决方案,希望能对其他人有所帮助。我没有混入一个模块,而是给state_machine打了补丁,以添加实例方法来注入代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StateMachine::Machine.class_eval do
    def inject_provisioning()

        event :start do
            transition :s_initial => :s_provisioning
        end
        after_transition :s_initial => :s_provisioning do |goal, transition|
            # Do useful stuff here
            true
        end

        event :provision do
            transition :s_provisioning => :s_completed
        end

        before_transition :s_provisioning => :s_completed do |goal, transition|
            artifact_type = transition.args[0]
            params = transition.args[1]
            # Useful stuff here
            true
        end

        after_transition :s_provisioning => :s_completed do |goal, transition|
            artifact_type = transition.args[0]
            params = transition.args[1]
            # Useful stuff here
        end
    end

    def inject_expiration()
        event :chron do
            expired_callback = lambda \
                do |goal|
                    return false if goal.expires_at == :never
                    goal.expires_at.to_i < DateTime.now.to_i
                end
            active_callback = lambda \
                do |goal|
                    return true if goal.expires_at == :never
                    goal.expires_at.to_i >= DateTime.now.to_i
                end
            transition all - :s_expired => :s_expired, :if => expired_callback
        end

        before_transition all - :s_expired => :s_expired do |goal, transition|
            goal.undo
        end
    end

现在,当我在类中打开一个state_machine定义时,我可以进行简单的类似宏的调用来注入代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
state_machine :machine_state, :initial => :s_initial do
    inject_provisioning
    inject_expiration
end

希望其他人能找到有用的东西。

EN

回答 1

Stack Overflow用户

发布于 2012-08-28 23:21:35

很难确切地说出您正在尝试做什么,但希望这段代码能有所帮助

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Artifact < ActiveRecord::Base
  extend Provision

  attr_accessible :some_value, :state

  state_machine :state, :initial => :initial do
    event :foo do
      transition :initial => :bar
    end

    Artifact.provision(self, :param1, :param2, :param3)

    event :fud do
      transition :bar => :initial
    end

  end
end

注意-我们混合使用extend而不是include -将方法放在类级别而不是实例,将self (状态机)传递给方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module Provision
  def provision(state_machine, *args)

    state_machine do
      event :provision do
        transition :initial => :provisioned
      end

      event :deprovision do
        transition :provisioned => :deprovisioned
      end

      before_transition :provisioned => :deprovisioned do |item, transition|
        # transition.args.length == 0
        args.each do |arg|
          puts arg
        end
      end
    end

  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12150448

复制
相关文章
了解图形数据库_图形数据库neo4j
您在Google上获得的图表数据库的描述主要是学术性的。我看到很多关于图形数据库的描述,它们讨论了Königsberg的七座桥梁或互联网的发明者Berners-Lee。有理论和愿景很好,但对我来说,我仍然认为引导相关性很重要。为什么图形数据库对您很重要?
全栈程序员站长
2022/11/16
8390
Neo4j使用Cypher查询图形数据
原文出处:http://www.yund.tech/zdetail.html?type=1&id=e5a7ca6d4e801e88790cc85b94e1f405 作者:jstarseven  Neo
大道七哥
2019/08/23
2.7K0
Neo4j使用Cypher查询图形数据
图形数据库Neo4j基本了解
原文出处:http://www.yund.tech/zdetail.html?type=1&id=f519df57f29b22863d2a6a79326bd22b 作者:jstarseven  在深入
大道七哥
2019/08/23
3K0
图形数据库Neo4j基本了解
图形数据库neo4j——(2)Cypher
基本语法 image.png 以上图片来源,非常感谢俞方桦博士提供的介绍Neo4j的资源 image.png 以上图片来源,非常感谢俞方桦博士提供的介绍Neo4j的资源 image.png
羊羽shine
2019/05/29
7650
图形数据库之Neo4j学习(一)
最近工作需要使用图形数据库来构建知识图谱,目前基于Java使用最广泛的有两个开源框架 (1) neo4j 社区版 免费 企业版 收费 (2) Titan 全开源 我们此次选择了neo4j的社区版,主要是项目紧,neo4j比较稳定,Titan可能比较新,虽然Titan肯定是未来的主流,我个人是看好Titan的,Neo4j没法存储巨大的一张关系图 ,因为他不支持分片,而Titan是天生分布式的,可以构建在Hbase,Cassandra之上外加+ES或者Solr存储索引,非常强大,再此不在过多 对比两个图形数据库
我是攻城师
2018/05/14
1.2K0
Neo4j中的图形算法:15种不同的图形算法及其功能
只有你拥有使用图形分析的技巧,并且图形分析能快速提供你需要的见解时,它才具有价值。因而最好的图形算法易于使用,快速执行,并且产生有权威的结果。
杜逸先
2018/06/04
12.9K0
Neo4j中的图形算法:15种不同的图形算法及其功能
图形数据库neo4j——(3)movie演示
演员的饰演关系ACTED_IN 其中包括角色名称属性,导演关系DIRECTED 制片关系PRODUCED 编剧 WROTE
羊羽shine
2019/05/29
5790
Windows安装Neo4j NoSQL图形数据库
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Petrochor
2022/06/07
5580
Windows安装Neo4j NoSQL图形数据库
图形数据库neo4j——(1)基础概要
节点可以想象成图中的对象,节点包含属性,属性可以是任何键值对的形式存储,节点可以有一个或多个标签,也可以没有标签,标签把节点组织在一起。
羊羽shine
2019/05/29
7670
Neo4J:图形设置
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
程裕强
2019/10/22
4150
Neo4J:图形设置
图形数据库之Neo4j核心概念介绍(二)
最近这段时间一直在搞知识图谱的一个项目,有点忙,所以博客更新有点慢,现在第一阶段的开发基本完活,后面有空会总结几篇与neo4j有关的文章。 有关neo4j的介绍和使用场景,这里不多说了,不了解的朋友可以参考我之前的文章 http://qindongliang.iteye.com/blog/2327919 我们的使用场景是用来存知识图谱有关的数据简单说就是会把从小学到高中所有的科目的里面的知识点给存储起来,让后建立知识点与知识点之间的依赖关系,从而最终会形成一张复杂的知识网络。举个例子: 比如某个学生,要学习
我是攻城师
2018/05/14
1.8K0
Neo4j-0.图形数据库和Neo4j
如果需要存放有很多链接的数据库,RDBMS不能提供用于遍历大量数据的性能。Graph Database提供了这种需要的性能。
悠扬前奏
2019/11/29
5470
如何清除右键菜单里的图形属性图形选项
2.保存文件。名字改为abc.cmd然后运行该文件就行了、出现提示点击确定。看看图标一点要变成这样。然后双击运行。就行了。
Lcry
2022/11/29
7980
Qt图形库-QCustomPlot
在出现的文件对话框中,选择qcustomplot.h和qcustomplot.cpp文件,将它们添加到您的项目中。 完成后,您的项目结构和.pro文件应如下所示:
ccf19881030
2021/04/19
2.4K0
Qt图形库-QCustomPlot
【C语言库文件】如何配置图形库
今天要教大家配置一个头文件,graphics.h ,这个头文件的作用是可以使用我们的编程软件来作图,我先来给大家展示一下可以使用代码做成的各种图形。
程序员周同学
2019/07/23
2.1K0
【C语言库文件】如何配置图形库
Django Ajax 实现历史图形查询
Django 通过Ajax接口实现前后端数据交互功能,通过Ajax实现当用户输入要查询的数据时,发送到后端,后端处理后推送到前端,前端直接绘制图形。
微软技术分享
2022/12/28
1K0
Django Ajax 实现历史图形查询
MATLAB中的图形绘制
MATLAB的图形通常都是通过描点、连线的方式来实现的。通过提供关键位置的点坐标及点与点之间的具体链接方式实现图形绘制。
技术客
2022/04/21
2.1K0
MATLAB中的图形绘制
数据库常见的图形工具有哪些?
疑惑一 MySQL常用的图形化管理工具有哪些? 现在随着PHP+MySql越来越火,周边相关产品也受到众多人的关注。在PC上修改数据库,查看数据库内容是研发人员常用的操作。下面就介绍几种常用的MySq
程序员互动联盟
2018/03/16
2.6K0
数据库常见的图形工具有哪些?
OpenCV中的图形绘制
OpenCV在Core模块中支持多种图形绘制与填充,方便开发者在图像对象识别与检测之后通过特定的图形轮廓加以显式表示。常见的几何形状包括线、矩形、圆形、椭圆,此外还支持文字显示。下面就让我们从API方
OpenCV学堂
2018/04/04
1.8K0
OpenCV中的图形绘制
Html中图形的变换
在网页的布局中,往往会涉及到一些动画效 果的设置,而这些动画的效果通常会有图形的变换。
算法与编程之美
2022/02/17
1.3K0

相似问题

如何在shell脚本启动的程序中打开URL?

11

Shell脚本- URL操作

14

在浏览器中打开url,从android上的shell脚本打开

10

打开URL并返回shell

22

解析shell脚本中的URL

160
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文