我是新来的宝石和最近遇到的问题比较值时创建的红宝石在轨道上应用程序。在控制我了如下发言,总是返回false:

if (user.id != params[:id])

问题是用户。id(这是一个积极的记录)是一个整数和params[:id]is a string.我花了一段时间来弄清楚这一点,我最后改变它:

if (user.id != params[:id].to_i)

现在该声明作为预期。

要避免这种误差在今后是有一个办法"汇编"或得到Ruby要警告你,如果你试图2比较不同的类型?其他一些问题,我碰到了,我想要"编译检查":

  • 警告我如果我创建一个变量,但不要使用它。帮助检查拼写错误的变量名称。
  • 确保一个方法中存在的一类,所以我可以避免的方法名称的拼写错误,还帮助进行重构,例如如果我重新命名方法。

目前,我正在使用红宝石的1.8.6-27RC2与轨2.3.2和RadRails IDE。

有帮助吗?

解决方案 6

最好的解决方案,我发现一个IDE,没有上飞法检查,如RubyMine.我不知道,如果将已经解决了我原来的问题,但它已经帮我查找和解决若干其他的语法和编译错误。谢谢大家的建议。

其他提示

试验,然后再编码。如果你写测试,以复盖所有部门应用程序,则得到保证,你的代码这两个运行并产生正确结果。

编辑:我应该指出的是,能够比较两种类型,不依赖于方法的名称,直到最后一秒,等等。都是核心功能的红宝石。

你不呼叫一个方法那么多你的消息发送到一个对象。对象是那么负责找出如何处理的方法。在轨道,这是用来access数据库中列Email.有没有方法,列,直到消息的列名发送给对象。

静的打字在Ruby是对的鸭子输入系统。一个经常可以得到多为自由而不用担心复杂的继承/接口方案。

我建议接受这些特征和补偿的不确定性,通过测试

红宝石不会让你重新定义==操作者为对象。在红宝石1.8你不能,红宝石1.9应该做的但我还没有能够得到我的剧本作为核心课程。它的工作原理以及对定制定的对象。

class Object

  alias :equal_without_warning :==

  def ==(object)
    unless self.class == object.class
      warn("Comparing `#{self.class}' with `#{object.class}'")
    end
    equal_without_warning(object)
  end

end

假设我没有做一些愚蠢的编码的错误,答案是否:你不能检查是否是比较不同类型的对象。

此外,我会说你不。实际上红宝石并不是设计工作,以这种方式,这更是一个java办法,而不是红宝石的风格。

红宝石是不是应该是安全的。它可以让你比任何两个对象,这就是它的许多权力从何而来。轨道是不可能的,没有这样的动态设计。

甚至编制语言,例如Java或C不会阻止你做==上的两个对象。因为Ben说,最好测试的第一个。检查结构你的工作。方法之一获取有关信息的红宝石的对象是使用:

puts object.class

在一般情况下,最好的办法(我知道的)为了避免这种类型的问题的动态/脚本语言的移动"的逻辑"的方法/指令和编写单元测试。基本上,任何可以失败应进行测试。页面上的代码应是愚蠢的逻辑...而不是只显示那些物品,以满足某些标准,它应该显示所有项目,并获得该名单的物品从一个方法,只有返回的那些应该显示出来。

两件事情我建议:

一:读了关于移民和难民委员会(或脚本/控制台轨).一个共同的发展实践在动态的语言是要试试出的代码段内的"实时"解释(如移民和难民委员会或轨道控制台)。这种做法可以追溯到早期的动态语言一般和口齿不清。红宝石-调试也是真的用于解决问题,并将已非常简单的方法,以找出错误您的例子。

两个:读了关于"鸭打字"。"种类"和变量的工作有点不同,在红宝石比许多人期望他们。我的理解是,一个变量用户。id没有一种"类型"。值 指出来 通过用户。id并有一个类型,但是变本身不。我相信这就是为什么没有工具,将有告诉你什么是你的错误是在前运行的程序。比较这两个变数不是一个错误,因为变量没有一种类型。用户。id是指向一个整数在这一点上在你的程序,但这将是完全合法的,分配给用户。id点要一串,在这一点上,比较会做更多的意义。:-)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top