分享 zw963 的 Ruby 笔记之`小提示`

zw963 · 2012年02月25日 · 最后由 zw963 回复于 2012年02月26日 · 3076 次阅读

引子


以下内容纯粹为本人以前学习 Ruby 时的笔记整理。限于个人理解能力,可以肯定一定有 大量的错误,与其说分享,不如说是写出来让大家检查。如果有什么不对,或不准确的 地方,也希望前辈们一定多多指正,不吝赐教。

我希望这里是一个具有良好氛围的中文社区 (我梦寐以求的那个 Ruby 中文社区) 所以我不 希望出现针对这个帖子的不和谐言语或对针对本人的任何不良言语.

总共分为五大部分:每一部分都有上百条,可能会有重复,有些就是直接抄书。都是我 个人的理解以及对某些文章片段的延伸,大家就将就着看了。

markdown 格式折腾了一下午,托万能 Emacs 的福,使用 markdown-mode 搞定了。现在才觉 出 edit-server 的好来,这是另一个 Emacs 插件,可以让我在 Emacs 下使用特定的模式直 接编辑 Chrome 浏览器打开的表单,不过也许用惯了 org-mode 的缘故,这个 markdown 依旧 觉得很不习惯。

顺便提个建议:我总觉得应该开个 lisp 版块。我想凡是接触过 lisp(或 elisp) 的人,应该 都会觉得这两门语言惊人的相似,混入,布尔真假等等,如果说 Ruby 字符串 (尤其是 1.9) 及其强大,完全继承自 Perl 的话,我倒是觉得骨子里的东西 (类,模块) 甚至面向对 象的方式 (Ruby 一切都是对象,lisp 一切都是列表) 都和 lisp 惊人的相似,即使表面上 看起来这是完全不同的两种语言,甚至是不同类型语言。

笔记分类


  • Ruby 新人可以看看我的基础理论部分,这也是当初我学习 Ruby 心路历程,虽然有些问题很初级,但是我就是这样一步一步走过来的。

  • 类相关部分全是都是关于 Ruby 的基石类的概念。这部分的概念极多.超级复杂,也很抽象,如果你真正理解了 Ruby 的对象模型,会有及其惊艳的感觉。这部分的东西,这部分的大部分内容都是双眼瞪着天花板冥思苦想,也偶尔查阅源码而写出的。深有感触,有什么不对的地方,欢迎高手指正。

  • 小提示部分也很杂乱,这是感觉自己脱离了基础部分之后,写的一些小技巧。

  • 常犯错误部分不用说了,直到现在自己仍旧屡犯不止的错误。

  • ruby 惯例是自己整理的一些`非必须'的小技巧,但是作为 Ruby 惯例,应该支持。

正文开始


Tips

下面是一些有用的小提示:

  1. 记住,方法永远是在一个对象上被调用的.
  2. 区分无参数的方法调用和局部变量的方法是看看当前作用域下没有赋值过程.
  3. 记住! 任何情况下,不出现在任何`循环'或者`迭代器代码块'当中的break语句都是说不通的!!
  4. 全局变量可以在任何地方被定义, 不过和常量不同, 全局变量不可以拥有`命名空间'
  5. 方法定义总是返回nil.循环结构在正常结束的情况下, 也总是返回nil
  6. Ruby当中的所有关键字都可以作为方法通过一个对象来显式的调用它们. (但不推荐这样做)
  7. 正则表达式字面量(/../)以及shell命令语法字面量(`..`), 在语义上等价于双引号.
  8. 注意: 是nil和false表示`布尔假值',而不是"nil"或"false".后两个是字符串,返回true!!
  9. 注意: 整数使用截断型除法, 如果需要得到有理数结果. require 'mathn'. 例如: 正常情况下:1/3 的结果是 0, 而不是 0.33. 如果加载 mathn 库,1/3 结果为有理数 (1/3), 而非 0.
  10. && 常常用在`满足一系列条件'才执行某个操作. 对||的一个习惯用法是:返回一系列候选值当中的第一个非 nil 值。
  11. ``不同于&&或||,and 和 or 的优先级相同 (自左向右运行).且它们的拥有几乎最低的优先级.(只比 if, unless, while, until 高一点)
  12. 条件和循环修饰符 (if, unless, while, until) 拥有最低的优先级.``
  13. 从来没有规定过,哈希的`值'必须是数字的`值'.
  14. 在代码块中调用return语句, 将返回代码块所在的`外围方法'的值.
  15. &, | 与 !以及^ 类似, 更多的用于`数学的逻辑运算', 而非用于`布尔逻辑'运算.
  16. 记住!! 如果你真的想在代码块,proc或lambda内返回一个值.使用next.而不是return.
  17. 只要不退出循环(并且调用者对象内容不变),每循环一次,next就表示调用者对象的下一个元素.
  18. Ruby当中语法糖的通用法则是:`去点去括号'.
  19. `顶层空间'其实就是Object类定义的内部.只不过在Object类内定义的所有实例方法,实例变量它们的self并非指向Object类自身, 而是指向了特殊的对象main.通过这种方式, Ruby在一个严格的面向对象的框架中, 仿真了面向过程的编程方式.
  20. Object类的所有的类方法, 其实是main对象的单例方法.(顶级空间而言)
记住! 任何情况下,不出现在任何`循环'或者`迭代器代码块'当中的break语句都是说不通的!!

语句有问题?

区分无参数的方法调用和局部变量的方法是看看有没有赋值过程.

这个区分的思路不是很靠谱,还是要理解方法和局部变量的作用域才能真正解决问题

$ irb
1.9.2p290 :001 > def xx
1.9.2p290 :002?>   p 'xx'
1.9.2p290 :003?> end
 => nil 
1.9.2p290 :004 > xx
"xx"
 => "xx" 
1.9.2p290 :005 > xx=1
 => 1 
1.9.2p290 :006 > xx
 => 1 
1.9.2p290 :007 > xx()
"xx"
 => "xx" 
1.9.2p290 :008 > 

@hysios, 语句貌似没问题啊。只不过我原样翻译而已,老外不就喜欢这么说么,双重否定,我想表达的意思是:任何出现在循环代码块之中的 break 才是有意义的。

@fsword, 我理解你的意思。呵呵。

zw963 zw963 的 Ruby 笔记之`基础理论` 提及了此话题。 11月13日 16:30
zw963 zw963 的 Ruby 笔记之`类相关` 提及了此话题。 04月03日 10:56
zw963 zw963 的 Ruby 笔记之`常犯错误` 提及了此话题。 04月03日 10:56
zw963 zw963 的 Ruby 笔记之`Ruby 惯例` 提及了此话题。 04月03日 10:56
需要 登录 后方可回复, 如果你还没有账号请 注册新账号