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

您是否避免使用任何Ruby语言功能?,ruby,syntax,Ruby,Syntax,在我看来,Ruby在语法上有很大的灵活性,很多东西可以用几种方式编写 作为Ruby程序员,为了清晰起见,您是否避免了任何语言特性/语法糖/编码约定?我问的是你选择的不要故意使用的东西,而不是你仍然需要学习的东西 如果你的答案是“我使用一切!”你有没有评论过如果读者知道相关的Ruby语法就会很明显的代码 [我对RoR环境下的Ruby特别感兴趣,但一切都是受欢迎的。]我通常不会过火,因为它可能会导致一些可维护性和可读性问题。如果使用正确,这是一个很好的特性,但很容易被忽略。大部分从Perl继承的“$

在我看来,Ruby在语法上有很大的灵活性,很多东西可以用几种方式编写

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

如果你的答案是“我使用一切!”你有没有评论过如果读者知道相关的Ruby语法就会很明显的代码


[我对RoR环境下的Ruby特别感兴趣,但一切都是受欢迎的。]

我通常不会过火,因为它可能会导致一些可维护性和可读性问题。如果使用正确,这是一个很好的特性,但很容易被忽略。

大部分从Perl继承的“$”全局变量(见pp333-336)的整个范围都非常可怕,尽管我有时发现自己使用的是
$:
而不是$LOAD\u PATH。

用于。。。在里面环它直接编译成obj.each(并相应地抛出一条奇怪的错误消息),完全没有必要。我甚至不知道它在哪里提高了可读性——如果你已经在ruby周围呆了一个多星期,每一个都应该是自然的。

这可能是显而易见的,但如果有其他选择的话,我通常避免使用eval。

我非常讨厌的一件事是对
{
的“不当”使用。。。结束块的
。我似乎找不到我自己在哪里学的这个练习,但一般都接受对单行块做
{}
做。。。结束多行块的

正确使用:

[1, 2, 3, 4].map {|n| n * n }.inject(1) { |n,product| n * product }
[1,2,3,4].map do |n| n * n end.inject(1) do |n,product| n * product end

使用不当:

[1, 2, 3, 4].map {|n| n * n }.inject(1) { |n,product| n * product }
[1,2,3,4].map do |n| n * n end.inject(1) do |n,product| n * product end


当然,所有这些都将首先执行giving
576

:如果是一个简短的一次性脚本,或者是命令行上的一行代码,或者是在
irb
中,我将打破许多规则。但我的大部分时间都花在中型或大型脚本或应用程序上。因此:

避免:


  • 使用
    class避免将太多的方法调用链接在一起。在Ruby中,将方法链接在一起是非常常见的

    user.friends.each {|friend| friend.invite_to_party}
    
    这可能看起来没问题,但会中断:

    更正式地说,函数的德米特定律要求对象O的方法M只能调用以下类型对象的方法:

  • O本身
  • M参数
  • 创建/实例化的任何对象 米以内
  • O的直接组件对象
  • 上面的例子并不完美,更好的解决方案应该是这样的:

    user.invite_friends_to_party
    
    这个例子的问题不是Ruby的错,但它很容易产生违反Demeter定律并使代码不可读的代码

    简而言之,避免使用降低代码可读性的特性。非常重要的一点是,您生成的代码易于阅读

    begin nil+234 rescue '' end
    

    上面的语法是有效的,但你永远不应该使用它。

    谢谢Firas,第一个好答案:这就是我要寻找的东西,来了解什么可能是危险的/难以阅读的等等。实际上,在Ruby 1.9中,除了性能之外,几乎没有理由使用eval。在块采用与方法相同的参数列表之后,使用复杂参数列表动态定义方法的常见情况就消失了。写得好,谢谢!是的,我期待着最终将我所有的应用程序都升级到1.9版本。:-)有趣的列表,谢谢!在对这个问题的回答中,我学到了很多关于ruby的知识。是的,但我不知道它是否回答了这个问题。谢谢你!他的观点是正确的,但我一直在寻找一些Ruby特有的东西,这些东西看起来不错,但实际上令人困惑。。。感谢您的回复,这是一个很好的观点。这些天,这样的火车残骸将被编码为
    user.friends.each(&:invite\u to\u party)
    。这是否总是一个好问题…我完全同意。这是一个磅符号,表示我从未理解过的实例方法:)谢谢你的回答。范围与
    的不同吗。。。在
    中,与
    obj.each
    相比,这是正确的,尤其是在Ruby 1.9中,但我认为这是不使用它的另一个原因。这只会增加古怪的行为。