ruby中组合逻辑的问题

ruby中组合逻辑的问题,ruby,logic,Ruby,Logic,写一个简单的蒙特卡罗模拟中子束。几何逻辑有问题(无论某物在一个环境中还是在另一个环境中)。我的问题是Ruby似乎在按顺序处理条件,并保持它得到的第一个值 下面的代码很好地说明了这一点: def checkPosition(*args) polyCylRad = 2.5 polyCylFr = 15 polyCylB = -2.0 borPolyBoxL = 9.0 / 2 pbCylRad = 3.0 pbBoxL = 10.0 / 2 cdBoxL = 9.5 /

写一个简单的蒙特卡罗模拟中子束。几何逻辑有问题(无论某物在一个环境中还是在另一个环境中)。我的问题是Ruby似乎在按顺序处理条件,并保持它得到的第一个值

下面的代码很好地说明了这一点:

def checkPosition(*args)

  polyCylRad = 2.5
  polyCylFr = 15
  polyCylB = -2.0
  borPolyBoxL = 9.0 / 2
  pbCylRad = 3.0
  pbBoxL = 10.0 / 2
  cdBoxL = 9.5 / 2

  position = Array.new
  material = String.new

  args.each do |item|
    position << item.inspect.to_f
  end
  xSquared = position.at(0) ** 2
  ySquared = position.at(1) ** 2
  zSquared = position.at(2) ** 2
  modX = Math.sqrt(xSquared)
  modY = Math.sqrt(ySquared)
  modZ = Math.sqrt(zSquared)

  puts xSquared
  puts Math.sqrt(ySquared + zSquared) <= polyCylRad
  puts (position.at(0) >= polyCylB)
  puts (position.at(0) <= polyCylFr)
  puts (position.at(0) >= polyCylB)and(position.at(0) <= polyCylFr)
  puts (position.at(0) <= polyCylFr)and(position.at(0) >= polyCylB)

  puts zSquared


  polyCylinder = (Math.sqrt(ySquared + zSquared) <= polyCylRad)and((position.at(0) >= polyCylB)and(position.at(0) <= polyCylFr) )
  puts polyCylinder
  borPolyBox = ((modX <= borPolyBoxL)or(modY < borPolyBoxL)or(modZ <= borPolyBoxL)) and not((modX >= cdBoxL)or(modY >= cdBoxL)or(modZ >= cdBoxL)) and not(Math.sqrt(ySquared + zSquared) <= polyCylRad)
  puts borPolyBox
  cadmiumShield = ((modX <= cdBoxL)or(modY < cdBoxL)or(modZ <= cdBoxL)) and not((modX >= pbBoxL)or(modY >= pbBoxL)or(modZ >= pbBoxL)) and not(Math.sqrt(ySquared + zSquared) <= polyCylRad)
  puts cadmiumShield
  leadShield = ( ((modX <= pbBoxL)or(modY <= pbBoxL)or(modZ <= pbBoxL)) or ((position.at(0) <= ployCylFr)and(Math.sqrt(ySquared + zSquared) <= pbCylRad)) ) and not(Math.sqrt(ySquared + zSquared) <= polyCylRad)
  puts leadShield

  if (polyCylinder) : material = "poly"
  elsif(borPolyBox) : material = "borPoly"
  elsif(cadmiumSheild) : material = "cd"
  elsif(leadSheild) : material = "pb"
  elsif(material == nil) : position = Array.new
  end

  thisEnvironment = Array.new
  thisEnvironment << position << material
  puts thisEnvironment.at(0)
  puts thisEnvironment.at(1)
end

checkPosition(40, 0, 0)
def checkPosition(*args)
polyCylRad=2.5
polyCylFr=15
polyCylB=-2.0
Borbolyboxl=9.0/2
pbCylRad=3.0
pbBoxL=10.0/2
cdBoxL=9.5/2
position=Array.new
material=String.new
args.每个do |项|

定位尝试使用
&
代替
|
代替
而不是
而不是


您的问题可能是优先问题-请阅读以了解更多信息。

尝试使用
&
而不是
|
而不是
而不是
而不是


您的问题可能是优先问题—请阅读以了解更多信息。

查看您的代码,设置此问题的方法是将四个“material”变量设置为布尔值。然后将这些布尔输入if-elsif-else块


这样做的问题是,第一个返回true的if将退出if-elsif-else块。如果这就是保持第一个值的意思,那么这是一个非常可预测的结果。

查看您的代码,设置的方法是将四个“material”变量设置为布尔值。然后将这些布尔输入if-elsif-else块

这样做的问题是,第一个返回true的if将退出if-elsif-else块。如果这就是你所说的保持第一个值的意思,那么这是一个非常可预测的结果。

你已经多次输入了“Sheild”,其中可能是“Shield”

在使用它们的上下文中,应该使用
&&
而不是
|
而不是
而不是
而不是
。原因是
的优先级很低,它们将导致赋值运算符无法按您希望的方式工作。比如说,

a = b and c
评估为

(a = b) and c
a = (b && c)
这样,a总是被赋予值b,然后在结果为真时,c被计算(并被丢弃)。另一方面,

a = b && c
评估为

(a = b) and c
a = (b && c)
这就是你想要的代码

除此之外,我会将所有这些代码移动到一个类中,这样我就可以创建很多小方法:

class PositionChecker

  def initialize(*args)
    @x, @y, @z = *args
  end

  def checkPosition
    ...
  end

end
寻找用方法调用替换checkPosition中的局部变量的机会。例如,您可以将borPolyBox移动到它自己的方法中(一旦它使用的所有值都是它们自己的方法):

还有一个职位:

def position
  [@x, @y, @z] if material
end
继续沿着这条线走,直到只剩下一袋细小的、专注的方法。

您已经多次键入了“Sheild”,您可能指的是“Shield”

在使用它们的上下文中,应该使用
&&
而不是
|
而不是
而不是
而不是
。原因是
的优先级很低,它们将导致赋值运算符无法按您希望的方式工作。比如说,

a = b and c
评估为

(a = b) and c
a = (b && c)
这样,a总是被赋予值b,然后在结果为真时,c被计算(并被丢弃)。另一方面,

a = b && c
评估为

(a = b) and c
a = (b && c)
这就是你想要的代码

除此之外,我会将所有这些代码移动到一个类中,这样我就可以创建很多小方法:

class PositionChecker

  def initialize(*args)
    @x, @y, @z = *args
  end

  def checkPosition
    ...
  end

end
寻找用方法调用替换checkPosition中的局部变量的机会。例如,您可以将borPolyBox移动到它自己的方法中(一旦它使用的所有值都是它们自己的方法):

还有一个职位:

def position
  [@x, @y, @z] if material
end

继续沿着这条线走,直到只剩下一袋细小的、集中的方法。

将所有
更改为
&
|

以前从未见过有人真正使用
array.at(index)
而不是
array[index]

我还建议不要使用
*args
,而是使用散列参数作为一种命名参数

def test(params)
  x = params[:x] || raise("You have to provide x!")
  y = params[:y] || raise("You have to provide y!")
  z = params[:z] || raise("You have to provide z!")
  puts x, y, z
end
并使用(Ruby 1.9+语法)调用它

42
4711
九十三


将所有
更改为
&
|

以前从未见过有人真正使用
array.at(index)
而不是
array[index]

我还建议不要使用
*args
,而是使用散列参数作为一种命名参数

def test(params)
  x = params[:x] || raise("You have to provide x!")
  y = params[:y] || raise("You have to provide y!")
  z = params[:z] || raise("You have to provide z!")
  puts x, y, z
end
并使用(Ruby 1.9+语法)调用它

42
4711
九十三


您能否更具体地说明您希望它如何评估逻辑?代码应该输出什么?好吧,现在我想看的是给定给各个域的真值。这取决于参数数组。我的问题在第一组puts语句中概述了,求值逻辑的顺序很重要,不管我是使用&、| |还是,为什么?我不认为是这样的,但是:我使用的是绝地解释器(我确信它只是在我的道路上)。你能更具体地说明你希望它如何评估逻辑吗?代码应该输出什么?好吧,现在我想看的是给定给各个域的真值。这取决于参数数组。我的问题在第一组puts语句中概述了,求值逻辑的顺序很重要,不管我是使用&、| |还是,为什么?我不认为是这样的,但是:我正在使用绝地传译员(我确信这正是我想要的),或者只是难以置信地相信父母的使用