`
lllyq
  • 浏览: 34616 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

ruby mixin的硬伤

    博客分类:
  • ruby
阅读更多
今天执行一个页面的的时候发现日志输出了50行的"==> Got Users::User from cache. (0.00000)",觉得很奇怪,没有请求这么多次user啊,分析到后面发现原来是gettext跟cache_fu着两个插件的冲突引起的

他们的方法都是mixin到model中调用,都有一个cache?的方法,gettext的是判断是否cache i18n message,cache_fu的是判断是否cache model,结果gettext的cache?被cache_fu的cache?覆盖了,gettext内部调用了多次cache?就出现了上述的症状,虽然执行结果正常,但背后的行为跟期望的已经是大相径庭了,而且这样的情况还无法通过test来检查,这里要不是默认打开cache_fu的benchmark,根本就不知道问题所在

这样用mixin的时候都要小心了,不知道还有多少隐患,估计ruby以后应该会有相应的解决方案,例如在mixin的时候检查同名方法并产生警告
也给一个写module的建议,只暴露必要的方法,内部的调用还是用一个专有namespace分开
分享到:
评论
5 楼 rubynroll 2008-04-30  
标题强悍点还是有好处的,至少吸引眼球嘛,只要内容是铿锵有力的就行~

我同意楼主的意见,mixin确实有潜在的危险,一旦有冲突,mixin顺序改变了就会影响结果,危险....给出警告是非常有必要的,目前加-w参数没有给出此警告.
4 楼 lllyq 2008-04-29  
Jan 写道
re楼上的,这个和mixin无关

http://avdi.org/devblog/2008/02/23/why-monkeypatching-is-destroying-ruby/

rails的plugins并不是银弹,有些实现的其实很糟糕,一定要慎用


怎么会没关系,其实就是多继承后同名方法的处理策略问题,ruby现在相当于基于顺序的处理
3 楼 Jan 2008-04-29  
re楼上的,这个和mixin无关

http://avdi.org/devblog/2008/02/23/why-monkeypatching-is-destroying-ruby/

rails的plugins并不是银弹,有些实现的其实很糟糕,一定要慎用
2 楼 lgn21st 2008-04-29  
标题很强悍...
不过说用很多插件的确带来这样的问题...还有很多插件随意打开Object的metaclass作一些有欠考虑的事情...
不过这个不能怪ruby,mixin其实是好孩子,插件是解决快速开发和reuse问题的不错方法,如果碰到问题首选从方法角度上解决,比如提交patch,而不是思考工具好还是不好
1 楼 Readonly 2008-04-29  
maxin? mixin?

相关推荐

    Mixin,MIXIN是使用ASM的Java的特性/混合框架.zip

    Mixin框架是Java编程语言中的一个开源项目,它利用ASM库来实现对类的低级别修改,也就是所谓的"混合"(Mixins)。这个框架的核心概念是将功能或行为注入到目标类中,而无需继承或者使用代理模式。在游戏开发、模块化...

    ruby(前途大好的ruby+rains)

    6. **模块(Module)**:Ruby的模块用于实现命名空间,代码重用和混合(mixin)功能。一个类可以包含多个模块,实现多重继承的效果。 7. **异常处理**:Ruby提供了异常处理机制,通过`begin..rescue..end`结构捕获...

    游戏脚本语言(ruby初步)

    Ruby的特点包括:动态类型、垃圾回收、闭包、块、Mixin等。 Ruby语言的名称来源于红宝石(Ruby),它是第四种宝石,symbolize着富有生命力和激情的红色,而 ruby语言也正是如此,它具有生命力和激情,是一种活泼...

    ruby中文教程,从基础到深入的让你学习ruby

    你可以定义方法,创建继承结构,使用模块(module)来实现代码复用和类别混合(mixin),以及利用元编程能力动态地修改类的行为。Ruby的块(block)、 Proc 和 Lambda 是实现回调和高阶函数的关键。 元编程是Ruby的...

    小程序mixin混入Page选项合并

    在微信小程序的开发中,`mixin` 是一种常见的代码复用机制,它允许开发者定义一组通用的方法或者属性,然后将这些通用部分混入(mix in)到不同的页面(Page)或组件(Component)中,避免了代码重复,提高了代码的...

    modernizr-mixin, 在Sass中,针对测试的简单而全面的mixin.zip

    modernizr-mixin, 在Sass中,针对测试的简单而全面的mixin hardwarebutton混合 一种简单的DRYier测试方法,在Sass中更快更。安装要求 ruby 3.4或者 LibSass 3.2Libsass警告:在 Libsass 3.2.3中有一个已知 Bug,它...

    dry-configurable, 一个简单的mixin使 ruby 类可以配置.zip

    dry-configurable, 一个简单的mixin使 ruby 类可以配置 干可以配置 概要class App extend Dry::Configurable # Pass a block for nested configuration (works to any

    ruby ebook

    4. **模块**:Ruby的模块用于实现命名空间、混合-in(mixin)机制,帮助实现代码的复用和组织。 5. **元编程**:Ruby强大的元编程能力允许在运行时修改或创建代码,这是Ruby区别于其他语言的一大特色。 6. **标准...

    《Ruby用户指南》中文版

    Ruby的面向对象特性非常突出,类、对象、继承、模块和 Mixin 是其核心组成部分。理解这些概念对于编写高效、可维护的代码至关重要。例如,Ruby中的万物皆对象,每个变量实际上都是一个指向对象的引用,而类则用于...

    ymixin是来自阅文前端团队的CSS预处理器mixin库

    【ymixin:阅文前端团队的CSS预处理器mixin库详解】 在前端开发中,CSS预处理器如Sass、Less和Stylus等已经成为提升样式编写效率和代码可维护性的必备工具。ymixin,作为阅文前端团队打造的一款CSS预处理器mixin库...

    ruby.rar

    类定义了对象的行为,而模块则提供了命名空间和混合(mixin)功能,可以将行为插入到多个类中。 Ruby还拥有丰富的标准库,包括文件操作、网络通信、日期和时间处理等,这些都通过简单的API供开发者使用。此外,Ruby...

    ruby入门到精通

    6. **模块**:模块用于组织代码,提供命名空间,支持混入(mixin)功能,允许类吸收其他类或模块的方法。 7. **异常处理**:Ruby提供了try-catch机制来处理程序运行时可能出现的错误,通过rescue关键字来捕获并处理...

    Ruby 技术手册(CHM 电子版)

    此外,深入理解对象模型和类的继承、模块的使用、 Mixin机制对于写出高效且可维护的代码至关重要。 Ruby的一大特色是其强大的元编程能力,这意味着在运行时可以修改甚至创建代码。例如,你可以动态添加方法到类,...

    Ruby 基础

    Ruby还支持模块(Module),用于实现命名空间、封装和混合(mixin)功能。 Ruby的异常处理机制允许程序员捕获和处理运行时错误。`begin..rescue..end`结构用于定义异常处理块,`raise`用于抛出异常。 在资源管理...

    ruby语言入门教程(中文版)[PDF]

    模块用于实现代码重用和封装,同时提供了混合(mixin)功能,可以让一个类包含另一个模块的方法。继承则允许一个类继承另一个类的属性和方法。 Ruby中的控制流结构丰富,包括条件语句(如if/else、case)、循环(如...

    ruby初学者教程(对初学者很有帮助)

    ### Ruby语言介绍与基础知识 #### 一、Ruby语言概述 **1.1 Ruby的历史** Ruby是一种面向对象的脚本语言,由日本人松本行弘(Matsumoto Yukihiro)于1993年开始开发。起初,Ruby是作为一种兴趣项目而诞生的,但...

    Programming-Ruby-1.9源代码

    - 模块用于组织代码,可以包含常量、类方法和实例方法,也可以实现类的多重继承(mixin)。 - 源代码中会展示如何使用`include`和`extend`关键字引入模块。 4. **异常处理** - `begin-rescue-end`结构用于处理...

    mixin白皮书

    mixin是一个闪电交易快速的点点对的数字交道项目,它拥有非常好的技术栈。

    教程资源ruby

    - **模块**:用于封装代码,支持混合(mixin)功能到类中。 - **单态方法**:只属于一个特定对象的方法,不同于类方法。 - **全局变量**、**实例变量**和**局部变量**:不同作用域内的变量类型。 - **类常量**:属于...

Global site tag (gtag.js) - Google Analytics