我有一个查看变量和返回的方法,具体取决于这些变量是什么:
def os_detect(os, zone)
if os.start_with?('centos')
unless zone == 'aws'
if os == 'centos7'
#puts "Not available yet"
return nil
end
end
else
#puts "Invalid OS Type"
return nil
end
return true
end
我正在为CLI和Rails构建,所以我试图摆脱看跌......但我仍然想向用户解释发生了什么。
我应该只返回字符串,如果没有阻塞,则为true吗?
在Ruby中有更好的方法来处理这种类型的逻辑吗?
更新:我的问题的主要目的是了解如何根据逻辑将上下文传递给用户。
因此,此方法在aws上返回centos7的 false ,或者除了centos *之外的任何其他操作系统。
用户如何知道错误以及如何解决?
答案 0 :(得分:4)
如果我正确理解了您的代码,则'centos'
以外的区域'centos7'
除了'aws'
以外的所有def os_supported?(os, zone = '')
os.start_with?('centos') && (zone == 'aws' || os != 'centos7')
end
。
nil
使用2种方法可能是个好主意:一种方法在需要时返回警告,另一种方法返回true
或def os_support_warning(os, zone = '')
return 'Invalid OS Type' unless os.start_with?('centos')
return 'Not available yet' if os == 'centos7' && zone != 'aws'
end
def os_supported?(os, zone = '')
warning = os_support_warning(os, zone)
if warning
puts warning
else
true
end
end
。
true/false
如果您接受true/nil
而不是def os_supported?(os, zone = '')
warning = os_support_warning(os, zone)
puts warning if warning
warning.nil?
end
,则可以使用:
false
nil
和%w(centos6 centos7 windows macosx).each do |os|
%w(aws not_aws).each do |zone|
@os = os
@zone = zone
puts '--------------------------'
puts "OS : #{os}\t Zone : #{zone}"
puts "#######BAD#######" if os_detect != os_supported?(os, zone)
end
end
都是假的:对于布尔逻辑,它们完全相同。
要检查我们的方法是否相同,我使用:
--------------------------
OS : centos6 Zone : aws
--------------------------
OS : centos6 Zone : not_aws
--------------------------
OS : centos7 Zone : aws
--------------------------
OS : centos7 Zone : not_aws
Not available yet
Not available yet
--------------------------
OS : windows Zone : aws
Invalid OS Type
Invalid OS Type
--------------------------
OS : windows Zone : not_aws
Invalid OS Type
Invalid OS Type
--------------------------
OS : macosx Zone : aws
Invalid OS Type
Invalid OS Type
--------------------------
OS : macosx Zone : not_aws
Invalid OS Type
Invalid OS Type
输出
$data = [
't_type_id' => request()->input('options'),
'd_id' => $id,
'result' => request()->input('message'),
'date' => $time->toDateTimeString()
];
TN::update($data); // this will update all TN entries
它们都返回相同的布尔值并发出相同的警告。
答案 1 :(得分:0)
我会试着更抽象地回答这个问题。我看到它的方式,你要问两件事:
将英语句子翻译成Ruby。通常有1:1的映射。对位也是如此 - 您可以将您的Ruby代码读作英语句子,以听听它是否真的听起来可以理解。首先,让我们阅读您当前的实现:
def os_detect(os, zone)
if os.start_with?('centos')
unless zone == 'aws'
if os == 'centos7'
return nil
end
end
else
return nil
end
return true
end
如果操作系统是 centos ,除非 aws ,如果操作系统是 centos7 ,则此功能不可用,否则 - 您的操作系统被视为无效。如果没有 - 我们确实支持这种环境。
即使使用标点符号(或代码中的缩进),您也必须停下来思考一下以提取它的本质。是的,与英语不同的代码具有明确的特权,但这并不能使其可理解。
现在让我们尝试将英语翻译成Ruby。用你自己的话说:
此方法为 aws 上的 centos7 或 centos
之外的任何其他操作系统返回false
def os_detect(os, zone) # "this method"
return false if os =='centos7' && zone == 'aws' || !os.start_with?('centos')
end
现在您可能会发现您的描述与您实际想要的内容不符。那是因为你真正想说的是:
此方法确定是否我们在 aws 上运行 centos7 或除 centos 之外的任何其他操作系统 p>
def os_detect(os, zone) # "this method"
os =='centos7' && zone != 'aws' || !os.start_with?('centos')
end
这又取决于你想要如何构建你的句子。主要是你将在最终return
之前使用任何一个保护条件或在实际条件下打印(类似于你所做的,但是可读的)。让我们试试:
如果在 aws 上检查 centos7 ,则此方法表示该功能尚不可用。它表示除非检查 centos ,否则目标操作系统无效。最后,它确定是否我们在 aws 或 centos之外的任何其他操作系统上运行 centos7 而不是
def os_detect(os, zone) # "this method"
puts 'Not available yet' if os == 'centos7' and zone != 'aws'
puts 'Invalid OS Type' unless os.start_with?('centos')
os =='centos7' && zone != 'aws' || !os.start_with?('centos')
end
此方法表示该功能尚不可用,如果在 aws 上检查 centos7 ,则退出该功能。它表示除非检查 centos ,否则目标操作系统无效且存在。否则会给出绿灯。
def os_detect(os, zone) # "this method"
if os == 'centos7' and zone != 'aws'
puts 'Not available yet'
return
end
unless os.start_with?('centos')
puts 'Invalid OS Type'
return
end
true
end