在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字符串的互转。二进制字符串与整数互转,包括uint8,uin16,uint32, 以及本地字节序和网络字节序两种...
如果你在项目中使用了Ruby,那么添加Stringex作为依赖可以极大地提升你的字符串处理能力。通过阅读源码,你可以更深入地理解其实现原理,甚至可以根据自己的需求扩展它的功能。 总之,Stringex是Ruby开发者的一个...
2.判断字符串中是否包含另一个串 代码如下: str.include? other_str => true or false “hello”.include? “lo” #=> true “hello”.include? “ol” #=> false “hello”.include? ?h #=> true 3.字符串插入 ...
2. **码点与图形字符**:Ruby中的`codepoints`方法返回字符串中每个字符的Unicode码点,这是一个整数值。码点并不总是直接对应于屏幕上看到的字符,因为某些码点可能表示组合字符序列。使用`String#chars`或`String#...
Ruby将字符串像数字一样处理.我们用单引号(‘…’)或双引号(…)将它们括起来. ruby> abc abc ruby> ‘abc’ abc 单引号和双引号在某些情况下有不同的作用.一个由双引号括起来的字符串允许字符由一个前置的斜杠...
Ruby中的字符串还与数组共享一些方法,比如 `each_line`、`each_byte` 和 `each_char`,它们都可以返回 `Enumerator` 对象。`Enumerator` 模块提供了一套灵活的方法,使得可以在不提供块的情况下对这些方法进行后续...
最近有个需求,需要根据一个字符串当作一个类来使用,例如: 有一个字符串 “ChinaMag”,根据这个字符串调用 类 ChinaMag下的方法。 解决办法: 1.rails可以使用 constantize方法。 代码如下: pry(main)> ...
Ruby-GeoPattern是一个开源库,由Jason Long 创建,它允许开发者根据输入的任意字符串生成美观的几何背景图像。这些图像可以用于网站设计、图形艺术或其他任何需要独特视觉元素的地方。GeoPattern利用了Ruby语言的...
标签中的“源码”意味着可能涉及具体实现代码,而“工具”可能是指使用某种编程工具或者库(如Ruby的`zlib`库)来实现字符串压缩功能。对于学习和开发,理解这些基础概念并能实际操作是十分重要的,特别是在处理...
数据类型则包括字符串、数字、布尔值、数组、哈希等。控制结构包括条件语句(如if/else,case)和循环(如while、for、each)。了解这些基础知识是编程的第一步。 其次,Ruby的面向对象特性是其核心魅力之一。它...
Ruby支持单引号和双引号字符串,与Python类似,它也使用三引号创建多行字符串: ```ruby text = ~EOF 这是一段 多行 字符串 EOF ``` 这里的`~`运算符(被称为heredoc)允许我们在多行字符串中直接插入换行。...
Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`instance_eval`允许在运行时修改类或对象的行为。此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义...
在Ruby中,一切都是对象,包括基本的数据类型如字符串、数字和布尔值。这种特性使得Ruby在处理复杂问题时具有很高的灵活性。文档中将详细讲解Ruby的基础语法,如变量声明、控制结构(条件语句、循环)、函数和方法...
8. **Ruby中的字符串拆分** Ruby的`split`方法非常直观: ```ruby str = "apple,banana,grape" fruits = str.split(",") puts fruits # 输出:apple\nbanana\ngrape ``` 以上就是不同编程语言中使用`string`...
接下来,我们将详细探讨Ruby中字符串的操作方法,以及如何利用Ruby处理不同格式的文本数据,例如CSV和XML。 首先,Ruby中的字符串处理功能非常丰富。字符串是Ruby中一个类(String class),它提供了一整套方法来...
它会提取首字母,如果字符串中有数字或特殊字符,它们会被忽略。例如,对于用户名 "jane123",它会生成 "JN" 的头像。 ## 5. 自定义字体 默认情况下,LetterAvatar 使用内置的字体。但如果你需要自定义字体,可以...
文档通常会涵盖Ruby的基础知识,例如变量、数据类型(如字符串、整数、浮点数、布尔值和数组)、流程控制(条件语句、循环)、函数、类与对象、模块、继承、混合、异常处理等。此外,它可能还会涉及Ruby的元编程特性...
Ruby中的分界符是指所有非字母或数字的单字节字符,可以成为字符串的界定符,并且它们通常需要成对出现,比如尖括号<和>、感叹号!和!、花括号{和}等。字符串的表示方法有多种,包括最简单的单引号和双引号包裹字符串...