Вы несколько раз набрали «Шилд», где вы, вероятно, имели в виду «Щит»
В контексте их использования вы должны использовать &&
вместо and
, ||
вместо or
и !
вместо not
. Причина в том, что or
и and
имеют такой низкий приоритет, что заставят ваши операторы присваивания работать не так, как вы хотите. Например,
a = b and c
оценивается как
(a = b) and c
Так, что a всегда присваивается значение b, а затем в результате получается истина, c оценивается (и отбрасывается). С другой стороны,
a = b && c
оценивается как
a = (b && c)
Что вам нужно в этом коде.
Кроме того, я бы переместил весь этот код в класс, чтобы я мог создать множество маленьких методов для вещей:
class PositionChecker
def initialize(*args)
@x, @y, @z = *args
end
def checkPosition
...
end
end
Ищите возможности заменить локальные переменные в checkPosition вызовами методов. Например, вы можете переместить borPolyBox в его собственный метод (как только все значения, которые он использует, являются их собственными методами):
class PositionChecker
...
def borPolyBox
((modX <= borPolyBoxL)||(modY < borPolyBoxL)||(modZ <= borPolyBoxL)) && !((modX >= cdBoxL)||(modY >= cdBoxL)||(modZ >= cdBoxL)) && !(Math.sqrt(ySquared + zSquared) <= polyCylRad)
end
...
end
Как только вы получите все эти предикаты в качестве собственного метода, вы можете создать метод для определения материала, например:
def material
[
[:polyCylinder, 'poly'],
[:borPolyBox, 'borPoly'],
[:cadmiumShield, 'cd'],
[:leadShield, 'pb'],
].each do |method, name|
return name if send(method)
end
nil
end
И еще один на должность:
def position
[@x, @y, @z] if material
end
Продолжайте в том же духе, пока не останется ничего, кроме мешка маленьких, сфокусированных методов.