您是否避免使用任何Ruby语言功能?

Dan*_*ark 8 ruby syntax

在我看来,Ruby具有很多语法灵活性,许多东西可能以多种方式编写.

是否有任何语言特性/语法糖/编码约定,为了清晰起见,您作为Ruby程序员避免使用?我问的是你选择不使用的东西,而不是你还需要学习的东西.

如果您的回答是"我使用了所有内容!",您是否曾经评论过如果读者知道相关Ruby语法则会显而易见的代码?

[我对RoR环境中的Ruby特别感兴趣,但欢迎一切.]

Mik*_*use 11

整个范围的"$"全局变量(参见Pickaxe2 pp333-336)大部分都是从Perl继承的,虽然我偶尔会发现自己使用$:而不是$ LOAD_PATH ,但是非常可怕.


Fir*_*aad 8

我通常不会过度使用猴子补丁,因为它可能导致一些可维护性和可读性问题.如果使用得当,它是一个很棒的功能,但它很容易被带走.


Ska*_*ade 7

for ... in ...循环.它直接编译为obj.each(并相应地抛出一个奇怪的错误消息)并且完全没必要.我甚至没有看到它提高可读性的地方 - 如果你已经在红宝石周围待了一个多星期,#each应该很自然.


Sam*_*Sam 6

这可能是显而易见的,但如果有任何替代方案,我通常会避免使用eval.


nic*_*ans 6

首先:如果这是一个简短的一次性脚本,或者在命令行上使用一行,或者在irb.但我的大部分时间都花在中型或大型脚本或应用程序上.所以:

避免:

  • 使用class << self代码块来实现类方法.这是一个可爱的伎俩,但并不比它更好def self.foo,也不那么可读(特别是在第一页之后).
  • for i in collection:collection.each改用.
  • proc {...}:通常lambda {...}更好.
  • 类变量(例如@@foo).它们是有问题的,通常可以毫不费力地用类级实例变量替换.
  • 任何导致警告的东西,最好是通过更严格的运行引起警告的任何东西ruby -w.如果您正在编写一个供他人使用的宝石,这一点尤为重要.
  • ' else'在begin ... rescue ... end'街区'.个人偏好:这是一个边缘案例太多,很少有人知道它存在或如何工作值得.
  • ObjectSpaceGC.你可能不需要去那里.你绝对不想去那里.
  • =begin=end多行评论.个人喜欢逐行评论.这些只会让我感到恶心.

使用它,但谨慎或作为最后的手段(并适当评论):

  • evalclass_eval传入字符串时(或等).有一些元编程技巧,你不能没有传递一个字符串.偶尔,字符串版本表现得更好(有时候很重要).否则,我更喜欢为我的元编程发送实际ruby代码块.对于许多元编程任务,可以完全避免eval.
  • 在类不是由我创建的类上添加或重新定义方法,可以由我控制之外的代码使用; 又称猴子修补.此规则主要用于较大的代码库和库; 我很乐意并迅速为小型一次性脚本做出例外.我也会例外修复有缺陷的第三方库(尽管你升级时可能会在脚下射击!).选择器命名空间(或类似的东西)将在很大程度上使ruby在这方面变得更好.也就是说,有时值得麻烦.;-)
  • 全局变量(类除外).我甚至会将$ stdout作为参数传递给我的对象或方法,而不是直接使用它们.它使代码的重用更加容易和安全.有时你无法避免它(例如$0,$:,$$和其他环境变量,但即使如此,你可以限制你的使用).
    • 说到这一点,我更喜欢完全限制我对perlish符号全局变量的使用,但是如果它们需要使用的话多一点,那么require "English".
  • break,redo,next,try:通常它们会使块,循环或方法比它本来更优雅.通常它们会让你在一段时间内没有看到该代码时抓住你的头几分钟.
  • __END__对于数据块.非常适合小型单文件脚本.对多文件应用程序无益.

不要使用它,但也不要真的避免它:

  • 试着抓
  • 延续

我经常使用的东西,其他人可能不关心的东西,或者我经常看不到的东西:

  • " and"和" or"关键词:他们有不同的优先级&&||,所以你必须要小心他们.我发现它们的不同优先级非常有用.
  • 正则表达式黑魔法(假设我在单元测试中有一些例子)
  • HEREDOC字符串