www.appflying.com,iPhone and iPad, top Apps, drop price.
‘default’ 分类下的文章
23

TextMate中文教程之项目的文件夹引用

2008年十月23日,星期四,下午 12:12 | 分类:default, TextMate | 给我留言 |

TextMate 支持两种项目。前面那章创建的是第一种项目,不管文件在硬盘上存在哪里只把它拖入到TextMate的边栏就可以。另外一种是保存文件系统。当你创建的项目文件在同一个文件夹里面,就创建了第二种项目。 项目中的文件夹引用的是硬盘上的真实对象。这有两个好处。第一,当应用程序得到焦点的时候 TextMate 会自动扫描该文件夹,如果其中的内容有更改则自动更新文件。其次,边栏下面那个文件夹按钮会在硬盘上创建真实的文件夹。新创建的文件夹在你当前所选的文件夹之内。 所以,你可以直接在TextMate里面操作和管理文件,而不用再跑到Finder里面去。所以我觉得还是第种组织项目的办法更棒。你慢慢会发现,整个项目处于同一个顶级文件夹是最方便的。因为你可以很方便的用svn来提交或者更新项目。很难想象,你把项目放到不同的文件夹去你该如何更新?麻烦死你!以后我会继续翻译如何用TextMate操作SVN命令,不过估计至少得2个月之后。哈哈。 那什么时候采用文件和组的项目呢?当你想操作不同文件夹下面的文件或者想在边栏中从新排列文件但是不想影响硬盘上的实际对象时。读者可能被我绕晕了,没关系举个例子。假如你是一个CSSer,每天的任务可能就是给公司的10个项目修改CSS,那么你就可以建立一个名为CSS-Work的项目,把不同项目的css文件都拖放到边栏中,并且根据轻重缓急组成不同的分组。明白了? 不论你采用的是哪种方式来组织项目文件,都可以使用边栏下面的Rename 或者 Remove Selected Files按钮。注意,根据你文件的组织方式不同。Remove Selected Files按钮可能仅仅是把文件从边栏里面删除或者是真的把它们扔到Trash去。 当然你也可以用边栏下面那个创建文件的按钮,如果你使用的是文件夹引用的方式来管理项目文件。那你在TextMate里面创建的文件就会在你边栏所选的那个文件夹里面创建,同时TextMate会提示你在本地保存文件。

(阅读更多精彩内容...)
23

1.2.2 方法查找(2)

2008年十月23日,星期四,上午 7:07 | 分类:default | 给我留言 |

单例类 单例类(又称元类或者本征类,请参阅下面的“单例类术语”解释)允许一个对象的行为能够区别于同一类的其他对象的行为。你以前可能已经见过打开单例类的一些语句了: 单例类术语 将元类这个术语用在单例类上似乎并不很准确。当称一个类为“元”的时候意味着它在某种意义上比普通的类更抽象。但也有例外,单例类仅仅是属于某特定实例的一个类。 真正的元类见于诸如提供了丰富的元对象协议的Smalltalk等语言中。Smalltalk的元类本身就是类而且其实例也是类。同样的,Ruby中唯一一个元类是Class,因为在Ruby中的所有类均是Class的实例。 另一个较普遍的用于替代单例类的术语叫做本征类,它源于德语eigen(意为“它自己的”)。一个对象的元类就是它的本征类(它自己的类)。 class A end objA = A.new objB = A.new objA.to_s # => “#<A:0x1cd0a0>” objB.to_s # => “#<A:0x1c4e28>” class >> objA #打开objA的单例类 def to_s; “Object A”; end end objA.to_s # => “Object A” objB.to_s # => “#<A:0x1c4e28>” class >> objA 表示打开objA的单例类。添加到单例类的实例方法与查找链路上的实例方法是一样的。其数据结构如图所示 上例中的objB是类A的一个实例。如果你问Ruby解释器,它将会告诉你objA也是类A的实例: objA.class # => A 然而这仅仅是表象,其背后隐藏着其他的一些情况。另一个类对象已经被插入到查找链路中了。它就是objA的单例类。本文当中将其标识为“Class:objA”。Ruby也给他起了一个相似的名字:#<Class:#<A:0x1cd0a0>>。与所有的其它类一样,单例类的klass指针(未显示出来)也指向Class对象。 单例类在此被标记为虚类(flags中的一个标记位被用来标识其为一个虚类)。虚类不能被实例化,而且一般来说在Ruby中看不到它,除非我们特意去找它。当我们问Ruby objA的类是哪个的时候,它将跟随klass和super指针的继承路径上溯到第一个非虚类为止。 因此,Ruby将告诉我们objA的类是A。需要记住的一点是:一个对象的类可能与klass指向的对象并不一致。单例类之所以称其为单例是是因为每个对象仅有一个单例类。这样,我们才能够毫无歧义的找到“objA的单例类”或者Class:objA。在我们的代码中可以假设单例类确实存在;但事实上考虑到执行效率,它只有在第一次使用的时候才被创建。 [...]

(阅读更多精彩内容...)
23

1.2.2 方法查找(1)

2008年十月23日,星期四,上午 5:05 | 分类:default | 给我留言 |

Ruby中的方法查找可以让人很困惑,但它却非常有规律。理解复杂情况的最简单方法就是将Ruby在后台创建的数据结构直观化。每个Ruby对象在内存中都有一个域的集合: 注:除了立即对象(immediate objects),如Fixnums,symbols,true,false和nil;我们在后面会介绍这些。 klass 指向这个对象的类对象的指针。(它是klass而不是class,这是因为后者在Ruby和C++中是保留字;如果叫做class,Ruby将用C编译器而不是用C++编译器编译。这些有意的误拼在Ruby的每个地方都有使用)。 iv_tbl “实例变量表”,是一个包含了属于此对象实例变量信息的哈希表。 flags 一个比特组,含有一些状态信息的布尔值,例如对象是否被污染,垃圾收集标记位,以及对象是否被冻结等。 每个Ruby类或模块不但具有上边的这些域,它们还有另外两个域: m_tbl “方法表”,一个包含了类或者模块中的所有实例方法信息的哈希表。 super 指向此类或者模块的超类的指针。 这些域在方法查找中扮演重要的角色,理解这些都非常必要。要特别指出的是,你应该密切关注klass与类对象的super指针之间的区别。 规则 方法查找规则非常简单,但需要知道Ruby数据结构是如何工作的。当一个消息发送到一个对象时,将会有下面的这些步骤依次发生: 注:Ruby中通常使用Smalltalk的消息传递术语,当一个方法被调用时,被叫做在发送一个消息,消息接收者是这个消息被发送到的对象。 Ruby 根据接收者的klass 指针指向的对象中搜索m_tbl 中的方法并进行匹配。(klass 指针的目标总是一个类对象) 如果没有发现匹配的方法,Ruby将进而根据此类对象的super指针指向的超类m_tbl中继续搜索。 Ruby以这种方式处理直到方法被找到或者直到到达了超类链的顶端。 如果在此链的所有对象上都未发现有匹配的方法,Ruby在原有方法调用者上调用method_missing 方法。这将重新开始上边的那些处理过程,但这次是查找method_mssing而不是原来的那个方法了。 这些规则应用的很普遍。所有这些在方法寻找中涉及到的有趣事情(混合,类方法,及自由类)都是因为有了klass和super指针。现在开始将更细致的讨论这个过程。 类继承 方法寻找过程可能会很让人困惑,所以我们要从简单的开始。下面的代码是Ruby中最简单的类定义: class A end 这段代码在内存中将生成下面这样的数据结构 上图是单个类的数据结构。双线边的方框表示类对象——它的klass指针指向Class 对象。A的super指针指向的是Object类对象,表示A继承了Object。为了清晰起见,从现在开始我们将在不会引起歧义的地方忽略指向Class,Module及Object的默认klass指针。 其次简单的情况是从一个类进行继承。类的继承简单的遵循了super指针的指向。例如,我们将创建一个继承自类A的类B: class B < A end 这段代码的最终数据结构如图 super 关键字总是指示出方法查找的链路方向,以下面的代码为例: class B def initialize logger.info “Creating 8 object” super end [...]

(阅读更多精彩内容...)
23

1.2.1 类和模块

2008年十月23日,星期四,上午 3:03 | 分类:default | 给我留言 |

类(class)和模块(module)是Ruby面向对象编程的基础。类主要负责封装及分离事物。模块则用于mixin——将一系列功能打包添加到类上为该类增加新行为,可以代替多重继承。模块也可用来将类分隔到不同的命名空间中。 在Ruby中,每个类名都是一个常量,因此Ruby要求类名必须以大写字母开始。此常量代表类对象,也就是一个Class类的对象,但它区别于“Class”对象,后者表示真正的Class类。当我们说“class object”(小写的c)的时候是指任何一个表示类的对象(包括Class自己)。当我们说“Class object”(大写的C)的时候是指Class 类,它是所有类对象的超类。 注:如果我们还不够迷糊的话——Class对象也有Class类。 Class类继承自Module类;每个类也都是一个模块。但是有个非常重要的区别。类不能mixin到其它类中,也不能扩展对象;只有模块可以这么做。

(阅读更多精彩内容...)
23

1.1.2 警告 和 1.1.3 自底向上编程

2008年十月23日,星期四,上午 3:03 | 分类:default | 给我留言 |

警告:重写自身的代码可能会非常难以编写和维护。你所选择的编程工具应该切合你的编程需要——它们带给你更多的便利而不是更繁琐。这里介绍的技术应该成为你工具箱中的更多工具之一,而不是唯一的工具。 自底向上编程是从Lisp世界借用过来的一个概念。其根本的思想就是从最底层开始建立抽象。先构建好最底层的结构之后,本质上你就是在基于这些抽象来构建其余的程序了。从某种意义上讲,你构建程序的过程就是在编写一种特定领域语言(domain-specific language),然后用这种语言来实现你的程序。 此概念在ActiveRecord中极度的有用。在建立了基本的schema和model对象后,你就可以开始基于此来搭建抽象了。许多Rails 项目都是这样,在还没有编写一行controller代码,甚至在没有进行Web 界面的设计的时候,就已开始了基于模型进行抽象的工作了。 class Order < ActiveRecord::Base has_many :line_items def total subtotal + shipping + tax end def subtotal line_items.sum(:price) end def shipping shipping_base_price + line_items.sum(:shipping) end def tax subtotal * TAX_RATE end end

(阅读更多精彩内容...)
23

TextMate中文教程之用快捷键创建项目

2008年十月23日,星期四,上午 3:03 | 分类:default | 给我留言 |

手动拖入文件和文件夹到TextMate项目中只是创建项目的一种方式,也是我最不常用的。有一个常用的办法是,把TextMate放到你的Dock上,确认TextMate处于运行中(看看你的Dock的TextMate图标下面有没有一个圆珠)。现在你可以把文件和文件夹拽到TextMate的图标上,它就会自动创建一个项目了,不过别忘了保存这个项目。不然你就白忙乎了。 在Terminal中创建TextMate项目是俺最喜欢的形式。你可以在mate命令后跟随多个文件名,文件夹或者一个shell命令。它会自动创建一个包含这些文件的TextMate项目。样例代码如下: mate . # a project of the current directory mate a.txt b.txt # a project of two files mate *.csv # a project of CSV files in the current directory

(阅读更多精彩内容...)
23

TextMate中文教程之在选取文件

2008年十月23日,星期四,上午 3:03 | 分类:default | 给我留言 |

项目中最重要的一点是快速访问项目中的文件。你可以用鼠标打开任何你需要打开的文件。TextMate中,如果你单击的是一个文本文件,单击会打开它。TextMate会根据文件的扩展名或者读取文件的前8KB来判断它是不是一个合法的UTF-8(ASCII)文本。 如果你需要更改TextMate和文件的关联类型,在边栏中选中文件,然后点边栏最下面的动作按钮选择 Treat Files with “ext” Extension as Binary/Text。这样TextMate就会记住这个文件类型的设置。在边栏中双击一个文件,会用默认关联的程序打开它,有可能不是TextMate。比如你在TextMate的边栏中双击了一个pdf文件,会用相关阅读器打开它。 你可以在代码窗口和边栏之间迅速切换,快捷键是Ctrl+Tab。当边栏得到焦点的时候,你可以使用方向键上,下来移动选取,也可以用方向键右来展开一个文件夹或者用方向键左来折叠它们。当你选取了一个想打开的文件,按一下回车键就和单击鼠标一样会打开这个文件。当你选取了文件时,单击空格键就可以给文件改名。 用上面介绍的方式来打开一个文件的确挺简单滴,但是如果你的项目有20个顶级文件夹和7000个文件。当你想这么打开一个文件或许累屁了。下面叫你一个简单滴方法。 加入你知道你要打开的文件的名字,那么选择Navigation中的Go to File按钮(Apple+T)。在打开的对话框中输入文件名,在下方的文件列表中用方向键来选取文件并用回车来打开这个文件。你会发现这个功能比你想的还强大,例如你要打开的文件名是pitches_controller_test.rb,那么你只需要输入pct,下面的文件列表就会自动列出相关的文件(看图)。现在选择这个pitches_controller_test.rb,TextMate会记住你的这次操作。下次你再用这个功能的时候,当你输入pct那么pitches_controller_test.rb会自动列到第一项来。 当你打开了7.8个文件咋整呢?就像Firefox能切换标签页一样。TextMate也让你这么干。你可以用Apple+数字键1-9来切换不同的代码窗口。也可以用Option+Apple+方向键左右来切换(看图)。 等等,我知道看这个文章的你跟我一样也是一个傻了吧机的程序员。那么还有一个快捷键你能用的上,那就是Option+Apple+方向键上。它会在你项目中的同名(但扩展名不同)的文件之间切换。举个例子,你可以用这个快捷键在项目中的 widget.h 和 widget.c 之间切换。

(阅读更多精彩内容...)
22

TextMate中文教程之创建项目

2008年十月22日,星期三,下午 5:05 | 分类:default | 给我留言 |

用TextMate创建项目是贼简单的。你可以创建一个空的项目并往里面放你需要的文件。选择File下的New Project (Ctrl+Apple+N)。空白的项目创建之后,有一个很大的提示告诉你如何操作下一步。就像它说的一样,随便把一些文件拖拽到那个边栏里面,他就会成为你项目中的文件并且一直显示在边栏里面了。 你可以用鼠标拖拽的方式操作边栏里面的文件。也可以用边栏下面那个文件夹按钮来创建一个文件夹。按住Apple键并且选择多个文件然后点边栏下面的那个动作菜单里面的Group Selected Files命令,就可以把这些文件搞成一个分组。 你可以选择是否显示边栏,快捷键是Ctrl+Option+Apple+D。当你的TextMate窗口靠右侧的时候,边栏会自动出现在左侧,反之亦然。而且它会自动记录你边栏是出现在哪一侧的,下次仍然会出现在那一侧。 最后你可以保存项目了,快捷键是Ctrl+Apple+S

(阅读更多精彩内容...)
22

1.1.1 别重复自己

2008年十月22日,星期三,下午 3:03 | 分类:default | 给我留言 |

站在更高的角度看可以发现元编程对实现DRY(Don’t Repeat Yourself)原则很有帮助,该原则也被称作“一次且仅仅一次(Once and Only Once)”,DRY原则主张在系统中要表达的一则特定信息只需要出现一次就足够了。重复往往是没必要的,特别是诸如Ruby这样的动态语言。就像函数化抽象可以使我们得以避免重复编写相同或者相似的代码一样,元编程使得我们可以避免重复那些在整个应用中多次出现的概念。 元编程主要是为了简单化。体验元编程技术最简单的方法之一就是寻找出重复的代码并将其提取出来。多次重复的代码可被抽取为函数;多次重复的函数或模式通常可以通过使用元编程将其提取出来。 在这里所说的设计模式是几个领域的交集;模式的设计是为了将解决同一问题时需要重复的次数降低到最小。在Ruby社区中,设计模式没有获得很好的评价。对于一些开发人员来说,模式仅仅是一个很普通的词汇,它用于描述应用中重复出现的问题的解决方案。对于另外的一些开发人员来说,它们则太过工程化了。 固然,模式可能被过度的使用,但是明智的使用则另当别论。设计模式到目前为止只是在减少认知复杂性方面非常有用。在Ruby中,一些细粒度的模式因为其透明性非常高,已不适于称其“模式”了;它们事实上已经成为一种习惯用法,大多数 “以Ruby方式思考(think in Ruby)” 的程序员都会不加思索的使用它们。模式应该被当作描述架构的一个词汇,而不是实现了某种解决方案的一个预先打包好的库文件。从这个角度想,好的Ruby设计模式与好的C++设计模式相比有非常大的差别。 元编程通常不应该被简单的用来减少代码重复。你应该经常评估是否有另外的技术选择能更好的解决问题,例如函数化抽象。但是,在少数情况下通过使用元编程来减少重复代码是最佳的解决方式。例如,当几个非常相似的函数必须得定义在相同的一个对象上时,就像ActiveRecord helper方法,元编程就可以发挥其作用了。

(阅读更多精彩内容...)
22

1.1 什么是元编程?

2008年十月22日,星期三,下午 2:02 | 分类:default | 给我留言(2 条留言) |

从今天开始,我将陆续在这里复制别人翻译好的书。这是很无耻的一件事,但是为了流量。我就无耻一把了。翻译者如果看到本文,有权利要求我删除相关内容。希望你们看不到。 ********************************* 我 是 分 割 线 ********************************* Rails 使元编程变得大众化。虽然它肯定不是第一个利用Ruby的广泛功能进行内省(introspection)的应用,但它却很可能是最受欢迎的Ruby应用。为了理解Rails,我们必须首先搞清楚Ruby中使Rails的实现变为可能的那些部分。本章介绍了后文中讨论的技术的基础。 元编程是一种使用代码来编写其它代码以及进行自省的编程技术。Meta(源于希腊语)这个前缀在这里的意思是抽象。使用了元编程技术的代码在两个抽象层次上同时进行工作。 元编程技术在多种编程语言中都可以使用,但更多的还是被应用于动态语言中,因为动态语言提供了更多的在运行时将代码视为数据进行操纵的能力。虽然像C#和Java这样较为静态的语言也提供了反射机制,但是仍然没有诸如Ruby这样的更趋动态性的语言那么透明,这是因为静态语言在运行时其代码和数据是分布在两个层次上的。 自省通常是在这两个层次上的某一个层上完成的。语法层的自省是最底层的——直接检查程序文本或者符号流。基于模板和基于宏的元编程一般来说都是在语法层进行的。 Lisp 通过既可以用于代码也可以用于数据的S表达式(本质上是程序抽象语法树的直接翻译)支持语法层的元编程。Lisp的元编程大量的使用了宏,宏的本质是代码模板。Lisp的这种方式带来的好处是可以在单一的层次上进行编程,代码及数据都以相同的方式表现,唯一的区别在于是否会被估值(evaluate)。然而语法层的元编程模式也有其弊端,用在同一命名空间下运行和估值的代码对两个抽象层次进行操作,会直接导致变量捕获(Variable Capture)和不经意的多次估值这类问题的出现。纵使有标准的Lisp惯用法可以处理这些问题,Lisp程序员仍然是需要学习和考虑更多的东西。 Ruby可以通过ParseTree库来完成语法层的自省,ParseTree可以将Ruby源代码翻译成S表达式。使用此库来编写的一个有趣的应用叫做Heckle,它是一个“测试的测试”框架,能够对Ruby代码解析及改变,例如改变字符串或者将‘true’和‘false’进行来回的调换。其想法是如果测试覆盖率很好,那么对代码任何部分的任何变更都应该导致单元测试的失败。 与语法自省相对应的一种更高层次的自省叫做语义自省,既通过语言更高层次的数据结构对程序进行探查。在不同的编程语言中语义自省的方式十分不同,在Ruby语言中一般来说都是作用于类及方法层上:创建方法,重写方法,给方法赋予别名(alias);截取方法调用;操纵继承链。这些技术和语法层自省相比与已有的代码更为正交(相关度更小),因为它们倾向于将已存在的方法视为黑盒而不是修改其内部实现。

(阅读更多精彩内容...)
  • 信息发布
macbook pro



关于 里克
里克:本名李玮,全职SOHO开发,技术咨询
邮件:hi@liwei.me
QQ:5175486
MSN:liwei78@live.com
05年开办公司,从事企业网站开发及维护,后从事社会化搜索引擎研发,08年底至今从事sns开发。近期专注Rails3,工作笔记整理及iphone开发学习。

狂爱Fm系列游戏。喜欢研究电影。关注IT新闻。写原创剧本和使用the movies拍摄短片,剪辑能力极强。美剧迷。狂热的英超曼城球迷。32岁的东北人。