- 浏览: 335288 次
- 性别:
- 来自: 北京
文章分类
最新评论
来说说ruby里面定义类方法的区别:
class T def T.class_method1 #第一种 end class << self def class_method2 #第二种 end end def self.class_method3 #第三种 end end def T.class_method4 #第四种 end T.class_eval do def T.class_method5 #第五种 end def self.class_method6 #第六种 end end class Object # The hidden singleton lurks behind everyone def metaclass; class << self; self; end; end def meta_eval &blk; metaclass.instance_eval &blk; end # Adds methods to a metaclass def meta_def name, &blk meta_eval { define_method name, &blk } end end T.meta_def :class_method7 do #第七种 end p T.singleton_methods.sort#["class_method1", "class_method2", "class_method3", "class_method4", "class_method5", "class_method6", "class_method7", "yaml_tag_subclasses?"]
区别:个人感觉用元编程方式定义的更动态一些灵活一些(丫的,废话!不动态不灵活还算是元编程吗)
还有就是用第二种(class << self )可以实现更多的功能
比如有人说类方法都是public的,还比如有人说类方法不能用别名...
其实用class << self 这种形式是可以实现的,下面看两个例子:
1.
class TT #很YD的类名... class << self private def private_class_method #这个有啥用?鬼知道有啥用! end end end TT.private_class_method# private method `private_class_method' called for TT:Class (NoMethodError)
2.
class TT#再YD一次.. class <<self def class_m puts "class method" end alias alias_class_m class_m end end TT.alias_class_m#class method
终上所述,如果要动态添加或改变class method的时候用元编程,正常情况下用class << self这种形式。。
评论
4 楼
night_stalker
2009-05-07
ychael 写道
lambda{|x|
lambda{|y|
lambda{|z|
x+y+z
}}}
lambda{|y|
lambda{|z|
x+y+z
}}}
1.9 用:
-> z, y, x {x + y + z}.curry
3 楼
ychael
2009-05-07
lambda{|x|
lambda{|y|
lambda{|z|
x+y+z
}}}
lambda{|y|
lambda{|z|
x+y+z
}}}
2 楼
Hooopo
2009-05-05
引用
private 的类方法可以被 protected 和 public 类方法调用,也可以用 __send__ 调用,不能被子类的各种方法调用(可惜类的 meta class 无法子类化 -__-),所以还是有用的……
也可以被private的类方法调用,也可以被子类的类方法调用...看下面代码:
class TT class << self private def private_class_method puts "private class method of TT" end def call_private_class_method private_class_method end end end class TTT < TT class << self def m private_class_method end end end TT.send(:call_private_class_method)#原来private method可以被send调用呀,有点晕+_+ #private class method of TT TTT.m #private class method of TT
引用
还有一种定义类方法的方法…… 误伤面积有点大……:
class Class def xxx #... end end
额,Class的instance method变成了所有class的class method...
引用
btw,在方法里定义方法也是可以的,这样一来我们就可以实现一个流式契约:
假设要求调用 A.b 之前必须调用一次 A.a,调用 A.c 之前必须调用一次 A.b,那么可以这样写:
如果调用不满足顺序要求,就会出现 'undefined method' 的 error
假设要求调用 A.b 之前必须调用一次 A.a,调用 A.c 之前必须调用一次 A.b,那么可以这样写:
class A class << self def a def b def c 'c' end 'b' end 'a' end end end
如果调用不满足顺序要求,就会出现 'undefined method' 的 error
这个好神奇...
1 楼
night_stalker
2009-05-04
private 的类方法可以被 protected 和 public 类方法调用,也可以用 __send__ 调用,不能被子类的各种方法调用(可惜类的 meta class 无法子类化 -__-),所以还是有用的……
还有一种定义类方法的方法…… 误伤面积有点大……:
btw,在方法里定义方法也是可以的,这样一来我们就可以实现一个流式契约:
假设要求调用 A.b 之前必须调用一次 A.a,调用 A.c 之前必须调用一次 A.b,那么可以这样写:
如果调用不满足顺序要求,就会出现 'undefined method' 的 error
还有一种定义类方法的方法…… 误伤面积有点大……:
class Class def xxx #... end end
btw,在方法里定义方法也是可以的,这样一来我们就可以实现一个流式契约:
假设要求调用 A.b 之前必须调用一次 A.a,调用 A.c 之前必须调用一次 A.b,那么可以这样写:
class A class << self def a def b def c 'c' end 'b' end 'a' end end end
如果调用不满足顺序要求,就会出现 'undefined method' 的 error
发表评论
-
新博客
2012-04-23 20:47 1734https://db-china.org -
Ruby Verbose Warning Mode
2011-10-16 14:48 2051Ruby在很多方面是一个更优雅的Perl,从Perl社区继承了 ... -
Pattern Match In Ruby
2011-10-07 01:17 2006最近看了一些Erlang,模式匹配是个好东西,简单的sum函数 ... -
Draper: View Models for Rails
2011-10-07 01:19 2268Draper是一个Ruby gem,它让Rails model ... -
Active Record batch processing in parallel processes
2011-10-07 01:20 2270Active Record 提供 find_each来分批处理 ... -
最轻量级的Ruby后台任务
2011-08-04 16:47 3860普通情况下ruby调用系统命令行的过程是堵塞的,无论是用sys ... -
test
2011-07-15 19:59 0test -
fiber
2011-06-17 09:37 0挖坑,待填。。 1.用到fiber.alive?、fiber ... -
Identity Map in Rails3.1
2011-06-12 18:29 2737Identity Map是Rails3.1的又 ... -
xx00
2011-06-06 03:40 0https://github.com/ngmoco/cache ... -
挖坑1
2011-06-06 02:17 0cache money 源码 替换memcache为redis ... -
websocket demo
2011-06-04 20:44 2054地址:https://github.com/hooopo/we ... -
ruby GC
2011-06-02 04:24 0http://blog.csdn.net/lijun84/a ... -
reduce method missing call stack with dynamic define method
2011-04-22 22:54 1592method_missing是ruby里面一个非常cool的h ... -
Autocompete with Trie
2011-04-09 04:04 1674像微薄里面用户输入一 ... -
用imagemagick和tesseract-ocr破解简单验证码
2011-04-09 01:31 18926工具:imagemagick + tesseract-ocr ... -
OAuth gem for rails,支持豆瓣,新浪微薄,腾讯微博,搜狐微博,网易微博
2011-03-26 03:13 4480地址:https://github.com/hooopo/oa ... -
用jmeter模拟amf请求进行压力测试
2010-12-16 16:56 30231.获取amf二进制包: 在本地建立proxy,端口为888 ... -
Memoization in Ruby
2010-11-14 11:42 1210这里的Memoization就是将ruby的方法或lambda ... -
整理了一下2008-2010的RubyHeroes博客列表
2010-10-07 02:26 2827Bryan Helmkamp(webrat作者)https:/ ...
相关推荐
2. **通假字**:通假字是中国古代汉字的一种现象,即一个字代替另一个字的写法。题目中提到的选项B,“陋者乃以斧斤考击而求之”的“考”是通假字,通“拷”,表示敲击。 3. **词汇解释**:考察了对文言文中词语的...
2. **阔门事件**:曹操在花园门上写“活”字,杨修解读出曹操不满意门太宽,展现了他的聪明才智,但也让曹操感到威胁。 3. **一合酥事件**:曹操在酥糖盒上写“一合酥”,杨修理解为“一人一口酥”,并分给众人,...
7. **小数的写法**:题目给出了长度单位的数字表示,如“九点一九”写作9.19,表示长度为9.19米;“五十八点三”写作58.3,表示长度为58.3米。 8. **小数的读写规则**:在用0、0、3、6组成小数时,(1)要求只读出一...
3. 词语拼音与字形检查:题目测试学生的汉字发音和书写准确性,如“熨帖”、“恪守”、“炽热”等词的拼音,以及“入不付出”、“斑斓”、“苍桑”等字词的正确写法。 4. 词语使用:考察学生对词语的理解和在语境中...
其实网页何尝不是一种程序呢?) 正是这种区别使得XML在网络应用和信息共享上方便,高效,可扩展。所以我们相信,XML做为一种先进的数据处理方法,将使网络跨越到一个新的境界。 六. XML的严格格式 吸取HTML松散格式...
根据提供的文件信息,这段文字其实并不是有效的教学内容或知识点,而更像是某种试卷的模板,包含了考试中常见的元素。尽管这样,我们还是可以从这段文字中提取出一些与小学数学三年级下册期末测试相关的信息,并进行...
7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择所需图 标。另一种是自己写资源文件。我们主要介绍第一种。新建Qt Resources file, 将它命名为menu。其他默认。 8.添加完后如下图。可以看到添加...
对HOOK了系统关键进程的模块卸载可能导致系统重启,这与该模块的写法有关系,所以卸载不了的模块不要强求卸载,可以先删除该模块的启动项或文件(驱动加载情况下使用删除后重启文件即消失)。 5:关于文件删除 驱动...
1. **掌握基本Markdown语法**:为了更好地利用Typora的强大功能,建议先学习并熟悉Markdown的基本语法,如标题、列表、链接、图片插入等常见元素的写法。 2. **利用快捷键提升效率**:Typora提供了许多实用的...
- `eval`的使用方式有很多,比如:`window["eval"]("XXX")`其实等同于`window.eval("XXX")`,这只是`eval`的另一种写法。 3. **代码解密技巧**: - 对于解密代码,可能会涉及到一些编码或者加密的手段,如示例中...
4、新增“类_通用对话框”支持大窗口样式与易自带样式,2种选择。用法和易一样,完全可以替代。 5、新增“进程_取句柄数”,功能与XP系统下任务管理器一样。 6、新增“进程_取IO读取计数”,功能与XP系统下任务管理器...
**8.10 如果你有迭字** 使用`{n,m}`来匹配重复次数。 **8.11 比对样式群组** 可以使用括号`()`来创建群组。 **8.12 比对样式的控制** 使用修饰符来控制正则表达式的匹配方式。 #### 9. 再谈控制结构 **9.1 ...
0、前面发的那版只是临时顺手写的,也没怎么检查,只有思路和流程有参考价值,但还是有网友表示支持,于是就有了这一版 1、测试发现精易模块 的函数比易语言 自带的更稳定,这一版本果断使用了精易模块 2、用于改动...
对HOOK了系统关键进程的模块卸载可能导致系统重启,这与该模块的写法有关系,所以卸载不了的模块不要强求卸载,可以先删除该模块的启动项或文件(驱动加载情况下使用删除后重启文件即消失)。 5:关于文件删除 驱动...
对HOOK了系统关键进程的模块卸载可能导致系统重启,这与该模块的写法有关系,所以卸载不了的模块不要强求卸载,可以先删除该模块的启动项或文件(驱动加载情况下使用删除后重启文件即消失)。 5:关于文件删除 驱动...
对HOOK了系统关键进程的模块卸载可能导致系统重启,这与该模块的写法有关系,所以卸载不了的模块不要强求卸载,可以先删除该模块的启动项或文件(驱动加载情况下使用删除后重启文件即消失)。 5:关于文件删除 驱动...
对HOOK了系统关键进程的模块卸载可能导致系统重启,这与该模块的写法有关系,所以卸载不了的模块不要强求卸载,可以先删除该模块的启动项或文件(驱动加载情况下使用删除后重启文件即消失)。 5:关于文件删除 驱动...