`
googya
  • 浏览: 140393 次
  • 性别: Icon_minigender_1
  • 来自: 汉川
社区版块
存档分类
最新评论

ruby中数字与数字字符串相加的原理

阅读更多
在ruby的世界中,很多东西不怕你做不到,就怕你想不到。正所谓,思想有多远,你就可以走多远。思想不一定非得是自己的,借鉴他人的也很好(不过,做人要厚道,如果是别人的idea,要把思想来源说明白、讲清楚)。ruby世界是个开放的世界,能在这样的世界里生活,那是件很爽的事情。扯了一下淡。。。。

    言归正传。。。


    刚看ruby时,看到 1+“23”这样的表达式,觉得很N(orth)B,数字跟字符居然可以这样运算。时间越久,就越想知道为什么可以这样做,具体的过程是什么样的,在rubinius之前,这个探索是痛苦的。因为ruby是用c语言实现的,而那个C语言的代码我看着实在是不习惯。比如下面的代码,直到现在也木有弄明白。哪位知道的可以给我指导一下。


static inline void
rb_ary_modify_check(ary)
    VALUE ary;
{
    if (OBJ_FROZEN(ary)) rb_error_frozen("array");
    if (FL_TEST(ary, ARY_TMPLOCK))
	rb_raise(rb_eRuntimeError, "can't modify array during iteration");
    if (!OBJ_TAINTED(ary) && rb_safe_level() >= 4)
	rb_raise(rb_eSecurityError, "Insecure: can't modify array");
}




   
     自从有了rubinius,又多了一条探索ruby世界奥秘的路,重要的是,这是条我比较习惯的路。好吧,还是回到1+“23”这个问题上来。
     rubinius的实现中,主要用到了3个方法:   :+, :redo_coerce,:math_coerce

具体如下:
def +(o)
  Ruby.primitive :fixnum_add
  redo_coerce :+,o
end


def redo_coerce(math,right)
    b,a = math_coerce(right)
    a.__send__ meth,b
end


def math_coerce(other,error = :coerce_error)
    begin
         values = other.coerce(self)#[other,self]
    rescue
         send error,other
    end

    unless values.__kind_of__(Array)&&values.length==2 do
          raise TypeError,"coerce must return [x,y]"  
    end
    values[1],values[0]
end

 




    整个实现就差不多了,但是没完!!!注意到math_coerce这个方法的参数之一是other,而other又调用了coerce这个方法。。。。。从中看出点什么东西来没????我猜你想到了,要使1+“23”能工作,也就是说能得到24,那么应该为String类实现coerce(貌似强制的意思)这个方法。



class String
  def coerce(n)
    if self['.']
      values =  [n, Float(self)]
      print "self is ",self,"\n"
      [n, Float(self)]
    else
      [n, Integer(self)]
    end
  end
end





这样就大功告成了。理解了这个,也就可以为其他很多的类实现运算,进而可以得到你想要的结果了。North B



分享到:
评论

相关推荐

    ruby的二进制字符串与hex互转,二进制字符串与整数互转的工具函数

    本资源是ruby代码,提供了一系列封装好的函数,用于快速进行转换,一个函数搞定,包括如下转换,二进制字符串与hex字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...

    Ruby中常用的字符串处理函数使用实例

    2.判断字符串中是否包含另一个串 代码如下: str.include? other_str => true or false “hello”.include? “lo” #=> true “hello”.include? “ol” #=> false “hello”.include? ?h #=> true 3.字符串插入 ...

    Ruby-Stringex一些实用的Ruby字符串扩展类

    Stringex 一些实用的Ruby字符串扩展类

    Ruby 字符串处理

    Ruby将字符串像数字一样处理.我们用单引号(‘…’)或双引号(…)将它们括起来. ruby> abc  abc ruby> ‘abc’  abc 单引号和双引号在某些情况下有不同的作用.一个由双引号括起来的字符串允许字符由一个前置的斜杠...

    Ruby中操作字符串的一些基本方法

    在Ruby中的String对象持有和操纵的任意序列的一个或多个字节,通常表示人类语言的字符表示。 简单的字符串文本括在单引号(单引号字符)。引号内的文本的字符串值: 'This is a simple Ruby string literal' 如果...

    Ruby中实现把字符串转换为类的2种方法

    最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 “ChinaMag”,根据这个字符串调用 类 ChinaMag下的方法。 解决办法: 1.rails可以使用 constantize方法。 代码如下: pry(main)> ...

    Ruby-Unicode字符串调试帮助

    Unicode字符串调试帮助

    Ruby-GeoPattern从字符串创建漂亮的生成几何背景图像

    GeoPattern - 从字符串创建漂亮的生成几何背景图像

    Ruby原理剖析_50页试读

    Ruby under microscope的中译版本

    ruby中文资源大全

    在工作中,他希望有一种比 Perl 强大,比 Python 更面向对象的语言。从1993年2月,他开始设计一个全新的自己的语言,1994年12月发布了第一个 alpha版本,并且将这种新语言定名为Ruby(红宝石)。 本教程内含多部中文...

    一个简单的Ruby脚本示例,它读取用户输入的两个数字,计算它们的和与乘积,并将结果输出到控制台

    在这个脚本中,gets方法用于从标准输入读取一行文本,chomp方法用于移除字符串末尾的换行符...Ruby中的字符串插值使用#{}来嵌入变量或表达式的值。 Ruby是一种解释型语言,因此你不需要显式地编译脚本;直接运行即可。

    Ruby常见面试题.pdf

    5. 什么是Ruby中的字符串(String)操作?请说明在Ruby中的字符串常用操作方法。 6. 在Ruby中如何定义函数(Method)?请简要介绍在Ruby中的函数定义和调用方式。 7. Ruby中如何处理异常(Exception Handling)?请...

    Ruby中文文档.zip

    Ruby,一种简单快捷的面向对象(面向对象程序设计)脚本语言,在20世纪90年代由日本人松本行弘(Yukihiro Matsumoto)开发,遵守GPL协议和Ruby License。它的灵感与特性来自于 Perl、Smalltalk、Eiffel、Ada以及 Lisp ...

    模糊字符串匹配:ruby的模糊字符串匹配库

    Fuzzy-string-match是用于ruby的模糊字符串匹配库。 很快(用RubyInline用C编写) 它仅支持Jaro-Winkler距离算法。 该程序是从Lucene 3.0.2手动移植的。 (lucene是Java产品) 如果要添加其他字符串距离算法,...

    Ruby中文帮助文档

    Ruby中文文档.CHM 方便ruby or rails学习.

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

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

    ruby中英文api

    ruby中英文api 适合于初学者。 希望能给大家带来一些帮助

    ruby教程.rar

    pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱 Ruby/Tk FAQ Ruby的相关书籍 Ruby Documentation Project (RDP) HTML Help版和分立HTML ReFe 索引 功能分类索引 发布条件

    JavaScript 字符串乘法

    原文地址:http://www.davidflanagan.com/2009/08/string-multipli.html原作者:David Flanagan在Ruby中,“*”操作符用一个字符串作为左边参数,一个数字作为右边参数,来实现字符串重复。例如,”Ruby” * 2 的值...

    ruby 中文文档 必备资料

    ruby 中文文档 必备资料 一定要下哦

Global site tag (gtag.js) - Google Analytics