我是 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
我实际上是在发送数据库中产品的列,我想获取相关产品的单位名称或单位名称作为返回。但是,我遇到了这个错误。
很可能你的问题并不是真正的方法
<=>
(是的,这是一个令人惊讶的方法调用) - 而是你尝试在对象 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)。