“我收到这样的错误:#<NoMethodError: private method `<=>'要求nil>

问题描述 投票:0回答:1

我是 Ruby on Rails 的新手,我无法理解原因。你能帮助我吗?我是 Ruby on Rails 的新手,我无法理解原因。 Ruby on Rails 中的“<=>”是什么意思?问题是:我正在 Rails 中动态使用 phlex 设置组件结构。当使用 prod_col 初始化时,我的产品已满,但是当我执行 div(class: @comp.props['_class']) {

@product.send(@comp.props['source']) }, I get an error."

def initialize(comp, product:)
          @comp = comp
          @product = product
        end

       
        def template
          if @comp._folder == 'prod_catalog'
            plain(@product.send(@comp.props['source']))
          else
            div(class: @comp.props['_class']) { @product.send(@comp.props['source']) }
          end
        end

我实际上是在发送数据库中产品的列,我想获取相关产品的单位名称或单位名称作为返回。但是,我遇到了这个错误。

ruby-on-rails ruby model-view-controller rubygems components
1个回答
0
投票

很可能你的问题并不是真正的方法

<=>
(是的,这是一个令人惊讶的方法调用) - 而是你尝试在对象 nil 上调用它。你使用哪个红宝石版本?在 3.3.1 上,方法 <=> 在 nil NilClass 上不是私有的。但如果我没记错的话,之前的情况有所不同。

如果你想了解该方法<=>你可以查看它的源代码。我喜欢为类似的事情启动一个撬控控制台:

[2] pry(main)> require 'pry-doc'
=> true
[3] pry(main)> show-source nil.<=>

From: object.c (C Method):
Owner: Kernel
Visibility: public
Signature: <=>(arg1)
Number of lines: 7

[4] pry(main)> nil <=> nil
=> 0
[5] pry(main)> nil <=> 2
=> nil
[6] pry(main)> nil <=> 'test'
=> nil
[7] pry(main)> nil.<=> 'test'
=> nil

只是为了感受一下,这是关于什么的。方法 <=> 通常用于描述比较运算符。如果两个对象相等,则预计返回 0。如果第一个对象较小,则返回 -1;如果参数(第二个对象)较小,则返回 +1。 所以只是关于它的一个小提示以及更多关于它的代码:

[8] pry(main)> 1 <=> 2
=> -1
[9] pry(main)> 2 <=> 1
=> 1
[10] pry(main)> show-source 1.<=>

From: numeric.c (C Method):
Owner: Integer
Visibility: public
Signature: <=>(arg1)
Number of lines: 13

VALUE
rb_int_cmp(VALUE x, VALUE y)
{
    if (FIXNUM_P(x)) {
        return fix_cmp(x, y);
    }
    else if (RB_BIGNUM_TYPE_P(x)) {
        return rb_big_cmp(x, y);
    }
    else {
        rb_raise(rb_eNotImpError, "need to define `<=>' in %s", rb_obj_classname(x));
    }
}

我真的希望您的

@comp
不包含某些用户代码。否则这个
@product.send
请求是非常危险的。

最后我无法真正回答你真正的问题,因为你错过了提供更多背景信息。但也许这已经对您的问题有所帮助:“‘<=>’在 Ruby on Rails 中意味着什么?”

我希望我能给你更多关于幕后使用的方法<=>的见解。 e.如果您对数组进行排序,请在控制台上进行以下小操作:

[17] pry(main)> class Test
[17] pry(main)*   def initialize(a,b)
[17] pry(main)*     @a, @b = a, b
[17] pry(main)*   end  
[17] pry(main)*   def <=>(test2)
[17] pry(main)*     return 0 if @a == test2.a && @b == test2.b
[17] pry(main)*     return -1 if @a <= test2.a && @b <= test2.b
[17] pry(main)*     return 1 if @a >= test2.a && @b >= test2.b
[17] pry(main)*     nil # you could remove this line, since it's default, if all the guards before fail - I just wanted to make the default return value obvious here
[17] pry(main)*   end  
[17] pry(main)*   attr_reader :a, :b
[17] pry(main)* end

[18] pry(main)> [Test.new(6,7), Test.new(1,2), Test.new(4,5)].sort
=> [#<Test:0x00007f9741fb1c80 @a=1, @b=2>, #<Test:0x00007f9741fb1c30 @a=4, @b=5>, #<Test:0x00007f9741fb1cd0 @a=6, @b=7>]
[19] pry(main)> [Test.new(1,2), Test.new(4,5), Test.new(1,7)].sort
ArgumentError: comparison of Test with Test failed
from (pry):36:in `sort'

第二个排序中断,因为 Test.new(1,7) 与我们的

<=>
定义中的其他两个实例不可比较(然后返回 nil,而不是 -1、0 或 1)。

© www.soinside.com 2019 - 2024. All rights reserved.