您是否避免使用任何Ruby语言功能?
在我看来,Ruby在语法上有很大的灵活性,很多东西可以用几种方式编写 作为Ruby程序员,为了清晰起见,您是否避免了任何语言特性/语法糖/编码约定?我问的是你选择的不要故意使用的东西,而不是你仍然需要学习的东西 如果你的答案是“我使用一切!”你有没有评论过如果读者知道相关的Ruby语法就会很明显的代码您是否避免使用任何Ruby语言功能?,ruby,syntax,Ruby,Syntax,在我看来,Ruby在语法上有很大的灵活性,很多东西可以用几种方式编写 作为Ruby程序员,为了清晰起见,您是否避免了任何语言特性/语法糖/编码约定?我问的是你选择的不要故意使用的东西,而不是你仍然需要学习的东西 如果你的答案是“我使用一切!”你有没有评论过如果读者知道相关的Ruby语法就会很明显的代码 [我对RoR环境下的Ruby特别感兴趣,但一切都是受欢迎的。]我通常不会过火,因为它可能会导致一些可维护性和可读性问题。如果使用正确,这是一个很好的特性,但很容易被忽略。大部分从Perl继承的“$
[我对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中,将方法链接在一起是非常常见的
这可能看起来没问题,但会中断: 更正式地说,函数的德米特定律要求对象O的方法M只能调用以下类型对象的方法:user.friends.each {|friend| friend.invite_to_party}
- O本身
- M参数
- 创建/实例化的任何对象 米以内
- O的直接组件对象
上面的例子并不完美,更好的解决方案应该是这样的:
这个例子的问题不是Ruby的错,但它很容易产生违反Demeter定律并使代码不可读的代码 简而言之,避免使用降低代码可读性的特性。非常重要的一点是,您生成的代码易于阅读user.invite_friends_to_party
begin nil+234 rescue '' end
上面的语法是有效的,但你永远不应该使用它。谢谢Firas,第一个好答案:这就是我要寻找的东西,来了解什么可能是危险的/难以阅读的等等。实际上,在Ruby 1.9中,除了性能之外,几乎没有理由使用eval。在块采用与方法相同的参数列表之后,使用复杂参数列表动态定义方法的常见情况就消失了。写得好,谢谢!是的,我期待着最终将我所有的应用程序都升级到1.9版本。:-)有趣的列表,谢谢!在对这个问题的回答中,我学到了很多关于ruby的知识。是的,但我不知道它是否回答了这个问题。谢谢你!他的观点是正确的,但我一直在寻找一些Ruby特有的东西,这些东西看起来不错,但实际上令人困惑。。。感谢您的回复,这是一个很好的观点。这些天,这样的火车残骸将被编码为
。这是否总是一个好问题…我完全同意。这是一个磅符号,表示我从未理解过的实例方法:)谢谢你的回答。范围与user.friends.each(&:invite\u to\u party)
中,与的不同吗。。。在
相比,这是正确的,尤其是在Ruby 1.9中,但我认为这是不使用它的另一个原因。这只会增加古怪的行为。obj.each