【问题标题】:Ruby features that are risky to use使用有风险的 Ruby 功能
【发布时间】:2011-08-14 02:21:22
【问题描述】:

作为一名 Ruby 程序员,您是否觉得任何使用起来有点风险的功能,可能是因为它的奇怪行为?它可能有据可查,但在调试时很难找到,或者有悖常理?

我通常尽量远离String#gsub!。文档说“执行 String#gsub 的替换,如果没有执行替换,则返回 str 或 nil。”因此,如果没有什么可替代的,那么它将返回 nil。实际上,我没有看到任何可以派上用场的用例。

那么,根据您的经验,您还有什么要补充的吗?

【问题讨论】:

  • gsub! 不会 如果没有执行替换,则用nil 覆盖字符串值。它只会返回 nil.
  • !?! 作为false 关键字的替代品;)
  • % space\ as\ a\ quote\ character
  • @Mladen Jablanović,是的,没错。我已经更正了语言。
  • 更好地定义“风险”。与燃烧地球大气层相比,我在 Ruby 中看到的任何东西都没有让我感到害怕,据传这与曼哈顿项目有关。除非您正在编写极其敏感的程序,否则您不太可能对 Ruby 造成任何伤害,并且此时您将非常清楚这些问题。如果你只是在学习,我不会担心。

标签: ruby


【解决方案1】:

Ruby 的元编程特性可以以非常危险的方式使用。我已经看到尝试在运行时重新定义代码类(如字符串或数组)上的常用方法的代码,虽然我可以看到这对于一个很小的临时脚本来说可能是可以接受的,但我认为这不是一个好主意具有许多依赖项或许多维护者的复杂应用程序。

【讨论】:

    【解决方案2】:

    嗯,Ruby 最广泛滥用的危险特性当然是evaling 字符串。在绝大多数情况下(如果不是全部)可以使用其他方法来避免,通常是define_methodconst_getconst_set 等。

    【讨论】:

      【解决方案3】:

      throw/catch(与begin/rescue不同!)基本上是GOTO,这可能被认为是在任何语言中使用的风险特性。

      【讨论】:

      • +0 表示使用“考虑”而不使用“有害”。
      【解决方案4】:

      lambdaProc 或块中使用return。语义are well defined,但你会弄错,你会得到一个LocalJumpError

      【讨论】:

      • 如何通过使用 lambda 的返回值获得 LocalJumpError?
      • 应该是Proc,而不是proc。现在看到了吗?
      • 我没有。我了解在 proc 中使用 return 语句的危险。但是当你从 lambda 返回时,它只是从 lambda 创建的过程而不是调用方法返回。所以我不明白的是如何在从 lambda 返回时获取 LocalJumpError。
      • 我的意思是它很容易以错误的方式得到它,因此它是一个有风险的功能。是Proc.new { return 1 } 还是lambda { return 1 }?语义是明确定义的,但如果你赶时间,你确定你总是能做对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多