我有多个类似的方法
[code="ruby"]def fun1
if ARRAY_PRE.include? array[0]
return true if ARRAY_PRE.include? array[1]
return (! ARRAY_PRE.include? array[2])
else
return false unless ARRAY_PRE.include? array[1]
return (ARRAY_PRE.include? array[2])
end
end
def fun2
if array[0] MIDDLE
return true if array[1] > MIDDLE
return (! array[2] > MIDDLE)
else
return false unless array[1] > MIDDLE
return (array[2] > MIDDLE)
end
end
...[/code]
仅仅判断标准不同,依据DRY原则,应该有类型下面这样的方法。
[code="ruby"]def det
if yield array[0]
return true if yield array[1]
return (! yield array[2])
else
return false unless yield array[1]
return (yield array[2])
end
end[/code]
思路是这样,但这个方法没法调用。
请大家帮忙想想究竟应该如何抽象这个框架方法。
[b]问题补充:[/b]
谢谢大家的踊跃答复。
原来是我疏忽了,看到yeild后的参数不一致,就想当然的以为不能直接调用。却原来可以直接用一个参数代替传入。
实例代码中的array应该是@array或$array。不过思路是一样的。
你的方法是可行的 是可以调用的。
def det(array)
if yield array[0]
return true if yield array[1]
return (! yield array[2])
else
return false unless yield array[1]
return (yield array[2])
end
end
p det([1, 2, 3]){|x|
x > 1.5
}# true
p det([1, 3, 4]){|x|
[1, 4].include?(x)
}# false
嗯?原本的fun1和fun2是如何可以调用的?array不是局部变量,这么写会找不到名字吧。
假如是:
[code="ruby"]def fun1(array)
if ARRAY_PRE.include? array[0]
return true if ARRAY_PRE.include? array[1]
return (! ARRAY_PRE.include? array[2])
else
return false unless ARRAY_PRE.include? array[1]
return (ARRAY_PRE.include? array[2])
end
end
def fun2(array)
if array[0] > MIDDLE
return true if array[1] > MIDDLE
return (! array[2] > MIDDLE)
else
return false unless array[1] > MIDDLE
return (array[2] > MIDDLE)
end
end
...[/code]
那直接用楼主的那段代码就足以达到抽象的目的了,例如对fun2:
[code="ruby"]def det(array)
if yield array[0]
return true if yield array[1]
return (! yield array[2])
else
return false unless yield array[1]
return (yield array[2])
end
end
a = [1, 2, 3]
MIDDLE = 2
result = det(a) {|i| i > MIDDLE }[/code]
楼主说的“这个方法没法调用”是指……?
我把楼上的代码再写的好看一点
[code="ruby"]
def det(array)
if yield(array[0])
yield(array[1]) && !yield(array[2])
else
yield(array[1]) || yield(array[2])
end
end
a = [1, 2, 3]
MIDDLE = 2
result = det(a) {|i| i > MIDDLE }
[/code]
LS代码是错的, 不过简化的思路蛮好
修改如下:
[code="ruby"] def det(array)
if yield(array[0])
!yield(array[1]) || yield(array[2])
else
yield(array[1]) && yield(array[2])
end
end
a = [1, 2, 3]
MIDDLE = 2
result = det(a) {|i| i > MIDDLE } [/code]
winteen你就不要在这里瞎搅和了,楼主自己写个测试就知道了。
更抽象的 ……
[code="ruby"]def fun &m
a, b, c = array
m[a] ^ (m[b] or !m[c])
end
def fun1
fun {|x| ARRAY_PRE.include? x}
end
def fun2
fun {|x| x > MIDDLE}
end[/code]
就用LS给的用例
a = [1, 2, 3]
MIDDLE = 2
LZ的
[code="ruby"]# def fun2
执行路径为
if 1 > 2
else
return false unless 2 > 2
结果为false
LS的
[code="ruby"]# def det(array)
[/code]
if 1 > 2
else
2 > 2 || 3 > 2
结果是true
night_stalker你的也不对 按照你的
[code="ruby"]m[a] ^ (m[b] or !m[c]) [/code]
当m[a]为假的时候永假
但 m[a] == false m[b] == true, m[c] == true时应该为真
再抽象一下:
[code="ruby"]def fun &m
m[0] ^ (m[1] or !m[2])
end
def fun1
fun {|i| ARRAY_PRE.include? array[i]}
end
def fun2
fun {|i| array[i] > MIDDLE}
end[/code]
winteen 同学请打开 irb 试试:
12> false ^ (true or !true)
#=> true
sorry 没看清楚是 ^
不过请试下用例: false false false
按照LZ的 应该返回false
而
false ^ (false or !false)
为true
唔,粗心了,少加个 not ……
[code="ruby"]
def fun &m
!m[0] ^ (m[1] or !m[2])
end
def fun1
fun {|i| ARRAY_PRE.include? array[i]}
end
def fun2
fun {|i| array[i] > MIDDLE}
end[/code]
不过 winteen 你得学学数理逻辑 ……
其实我在第一次回的时候就用真值表+极小项的笨办法简化过这个布尔表达式了
[code="ruby"]# def det(array)
已经是非常简洁的程序表述了
there's always a shorter one :)
不用 xor 就是
[code="ruby"]
def fun &m
x = m[1] or !m[2]
m[0] ? x : !x
end[/code]
又大意了 …… 不能编辑真麻烦 ……
[code="ruby"]def fun &m
x = m[1] || !m[2]
m[0] ? x : !x
end[/code]
额~ 原来还可以继续简化的。。。 果然数理逻辑没学过关~
异或是不对的
[code="ruby"]# def fun &m
考虑 false false true
!false ^ (false or !true) 结果是true
但根据lz的
应该
if false
else
return false unless false
结果为false
无法简化了。
最多把if else 改成 三目表达式。
确实,异或不能代替 if …… 这个东西的特点是不能擦除信息,该补数逻的是我 ……
验证了下真值表:
[code="ruby"]
def f a,b,c
a ? (b ? b : !c) : (!b ? b : c)
end
def test
tf = [true, false]
tf.each{|a| tf.each{|b| tf.each{|c|
puts 'fuk' if f(a,b,c)!= g(a,b,c)
}}}
end
def g a,b,c
!a ^ !b ^ !c
end
test # 4 个不对
def g a,b,c
!a ^ (b || !c)
end
test # 2 个不对
def g a,b,c
d = b || !c
a ? d : !d
end
test # 2 个不对
[/code]
弱弱的文一下,数理逻辑是不是离散数学第一章讲的那些啊。。
:oops: 只记得 ||和&&了。。