虽然调用用户输入的方法是一个糟糕的主意,但是在像Ruby这样的语言中,您可以使用a.method()在Object上调用method(),但也可以使用send(method_name,other_object ),例如:
$ ruby -e "p '1234abc'.send(:to_i)"
1234
ruby -e "puts '1234ab'.method(:to_i).call"
1234
另一个例子:
ruby -e "n1, n2 = 5, 6 ; puts %i(+ - * / fdiv).map { |x| %[#{n1} #{x} #{n2} = #{n1.send(x, n2)}] }"
5 + 6 = 11
5 - 6 = -1
5 * 6 = 30
5 / 6 = 0
5 fdiv 6 = 0.8333333333333334
另一个例子:
$ ruby -e "puts ; n = ->n { print %(Enter #{n}: ) ; STDIN.gets.strip } ; num1 = n.('first value') ; num2 = n.('second value') ; meth = n.('method name') ; puts num1.to_i.send(meth, num2.to_i)"
Enter first value: 5
Enter second value: 10
Enter method name: *
50
$ ruby -e "puts ; n = ->n { print %(Enter #{n}: ) ; STDIN.gets.strip } ; num1 = n.('first value') ; num2 = n.('second value') ; meth = n.('method name') ; puts num1.to_i.send(meth, num2.to_i)"
Enter first value: 50
Enter second value: 20
Enter method name: fdiv
2.5
我可以用JS做同样的事情吗?
例如:
var foo = '+'
1.call(foo, 2) # => 3
8.call('*', 5) # => 40
'Hello World'.call(split, ' ') # => ["Hello", "World"]