我有一个接受两个参数的方法。其中一个是可选的。这些参数实际上是应该发送给对象的方法的名称。如果在不使用条件的情况下错过第二个参数,如何避免获取NoMethodError
?我可以发送一些没有做任何事情的“空”方法吗?在我的情况下,这工作正常,但它看起来不太好。感谢。
def foo param_1, parm_2='to_s'
object.public_send(param_1).public_send(param_2)
end
UPD 由于@Surya
,发送已更改为public_send答案 0 :(得分:3)
你可以这样使用send
:
object.send(:my_method, param_1, param_2)
其中my_method
是为object
定义的方法名称。我建议您改用public_send
,因为send
会让您的代码调用私有方法,这可能会导致应用程序出现意外行为。
您可以快速检查param_2是否可用:
value = param_2.nil? ? object.send(param_1.to_sym) : object.send(param_1.to_sym).send(param_2.to_sym)
答案 1 :(得分:2)
如果您使用的是Ruby 2.2.0或更高版本,则可以在任何对象上调用if ( localStorage.getItem('completed') == "true" ) {
console.log('Completed');
// do something here
} else {
var num = (localStorage.getItem('num') == null) ? 1 : localStorage.getItem('num');
num = parseInt(num);
if (num < 5) {
localStorage.removeItem('num');
localStorage.setItem('num', num+1);
document.getElementById('numberIn').value=num
document.forms[0].submit();
} else {
localStorage.setItem('completed',true);
}
}
并获取该对象。所以在你的例子中你可以做到
#itself
它与
相同def foo param_1, param_2 = :itself
object.send(param_1).send(param_2)
end
我也是第二个Surya的建议,总是使用def foo param_1, param_2 = nil
thing = object.send(param_1)
if param_2
thing.send(param_2)
else
thing
end
end
代替。