- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有以下代码:
def sort_descending _objects, field
_objects.sort { |b,a| a.send(field) <=> b.send(field) }
end
当 a.send(field)
返回一个 String
而 b.send(field)
返回一个 Integer
,然后抛出一个 ArgumentError
。我试图通过以下方式捕获此异常:
def sort_descending _objects, field
_objects.sort { |b,a| safe_compare(a,b,field) }
end
def safe_compare a, b, field
a.send(field) <=> b.send(field)
rescue
a.send(field).to_s <=> b.send(field).to_s
end
但这也会抛出一个ArgumentError
。我不知道为什么。谁能解释这种按排序抛出异常的行为?
虽然这个解决方法有效,但它看起来很丑
def sort_ascending _objects, field
_objects.sort do |a,b|
safe_compare(a,field,b) <=> safe_compare(b,field,a)
end
end
def safe_compare a, field, b
_a,_b = a.send(field), b.send(field)
_a.class == _b.class ? _a : _a.to_s
end
要重现的代码是 here .
最佳答案
Can anybody explain this?
是的,<=>() 方法不会引发异常。看一看:
def sort_descending _objects, field
_objects.sort {|b,a| safe_compare(a,b,field) }
end
def safe_compare a, b, field
a.send(field) <=> b.send(field)
rescue
puts 'in rescue clause' #Let's trace the flow of execution
a.send(field).to_s <=> b.send(field).to_s
end
class Dog
def greet
"hello"
end
end
class Cat
def greet
10
end
end
d = Dog.new
c = Cat.new
p d.send("greet")
p c.send("greet")
p safe_compare(d, c, "greet")
--output:--
"hello"
10
nil
请注意,rescue 子句中的 puts 语句没有输出。
来自 ruby 字符串文档:
string <=> other_string → -1, 0, +1 or nil
nil is returned if the two values are incomparable.
这一行:
a.send(field) <=> b.send(field)
相当于:
a.send(field).<=>( b.send(field) )
如果 a.send(field) 返回一个字符串,那么一个字符串正在调用 <=>() 方法。 Numeric 类还定义了 <=>() 方法,因此如果 a.send(field) 返回一个数字,那么一个数字正在调用 <=>() 方法。如果两个对象不可比较,则 String#<=> 和 Numeric#<=> 都返回 nil——它们不会抛出异常。其他类对 <=>() 方法有类似的定义。
因此,在您的 safe_compare 方法中不会引发任何 ArgumentError。但是,nil 不是排序 block 的有效返回值,因此 sort() 会引发 ArgumentError。
你需要做这样的事情:
def sort_descending _objects, field
_objects.sort { |b,a| safe_compare a, b, field }
end
def safe_compare a, b, field
result = a.send(field) <=> b.send(field)
result ||= a.send(field).to_s <=> b.send(field).to_s
end
关于ruby - ruby 中的 spaceship <=> 运算符如何抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18346352/
这个问题在这里已经有了答案: C++ Does not name to a type (2 个答案) 关闭 10 年前。 我正在开发一款小行星游戏,以此自学一些编程知识,但我遇到了一个错误,即我的一
这里是 Ship、Asteroids、BaseShapeClass 类的完整代码。 Ship Class 的形状继承自 BaseShapeClass。 Asteroid类是主要的源代码,它声明了Gra
我试图在基类中使用宇宙飞船运算符,所以我将通过编译器定义所有运算符。 (来源:https://devblogs.microsoft.com/cppblog/simplify-your-code-wit
我正在研究使用力、加速度和质量在笛卡尔 map 上进行点对点宇宙飞船旅行的一些逻辑。飞船将以 1G 的加速度加速燃烧至目的地,在中途标记处翻转 180 度,并以 1G 的加速度减速到达目的地的相对停靠
我做了这些方法: public Player(double x, double y){ this.x = x; this.y = y; ImageLoader loader =
我已经编写了一些代码来模拟带有单个推进器的船的无重力运动。大多数时候它都能正常工作,而且船会完美地到达目的地,但有时它会无限加速。但我想不通,为什么? seek(target) { var d
考虑这个代码: #include #include class A { public: int i = {}; std::strong_ordering operator (A const
我正在开发一款 Direct3D9 太空模拟器游戏,我需要在其中创建一个摄像机来保存玩家飞船的位置和视角。目前,我将我的代码限制为仅用于前后移动、上下移动以及扫射。下面是我的代码,它有问题。一切都包装
所以我是 Unity 的新手,昨天安装了 Unity 并且想制作一个简单的游戏来让自己入门......所以我试图让一个 3D 立方体在上下移动立方体的同时旋转。 我按照在线 2D 教程发现了我正在做的
Ruby 有一个叫做组合比较或“宇宙飞船”运算符的东西,它看起来像这样: 它执行以下操作: a b := if a b then return 1 Credit Javascript 中
一段时间以来,我一直在研究太空模拟游戏。起初,我使用自己的 3d 引擎和软件光栅器。 但是当实现纹理的时间到了时,我放弃了。现在我在一段时间后重新开始,现在我正在使用 Opengl(带有 SDL)来渲
我有以下代码: def sort_descending _objects, field _objects.sort { |b,a| a.send(field) b.send(field) } e
我需要按照以下逻辑对以下数组进行排序:如果“分数”相同,我想使用“时间”进行比较。数组如下: $user_scores = [ 82 => [ 'score' => 1, 'time' => 6.44
这个问题在这里已经有了答案: What is the ("spaceship", three-way comparison) operator in C++? (6 个回答) 关闭 7 个月前。 假
我有一个程序可以绘制一个简单的金字塔形状,我可以用箭头键旋转它,但我想把这个形状变成一架简单的飞机,而不是旋转我想让它继续用箭头键移动(飞行) .我怎样才能做到这一点? 这是我目前所拥有的: #inc
这是我的代码。我已经坚持了一段时间。我就是想不通。我遵循的指南要我在 Fighter 子类中使用 super.init(),但每次尝试时似乎都会给我一个错误。 class Spaceship {
为什么我们在 C++ 中需要这样的运算符,它在现代 C++ 编程中有何用处?任何可以应用此方法的真实代码示例都会有所帮助。 这个问题旨在了解现实世界中的实际应用,而无需阅读 Herb Sutter 的
我想知道 php 宇宙飞船运算符如何比较字符串、对象和数组。例如,下面的代码。 echo "Its Me at SO" "Its Me at SO"; 将返回 0,因为我知道所有字符都相同,计数相同
在 PHP 7 中,我们有一个新的运算符,宇宙飞船运算符 , 我发现它与 strcmp() 非常相似(如果不相同的话) . 它们之间有什么区别吗? 编辑:我问的是它们之间的区别,未提及 What i
我正在和一些人一起开发一个 3D 空间交易游戏,我被指派做的其中一件事是制作一个引导计算机“隧道”,让船通过,隧道由正方形组成用户飞到他们的目的地,随着用户离目的地越来越近,数量会增加。 只需要为船前
我是一名优秀的程序员,十分优秀!