Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
505 views
in Technique[技术] by (71.8m points)

reflection - Can I dynamically call a math operator in Ruby?

Is there something like this in ruby?

send(+, 1, 2)

I want to make this piece of code seem less redundant

if op == "+"
  return arg1 + arg2
elsif op == "-"
  return arg1 - arg2
elsif op == "*"
  return arg1 * arg2
elsif op == "/"
  return arg1 / arg2
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Yup, simply use send (or, better yet, public_send) like so:

arg1.public_send(op, arg2)

This works because most operators in Ruby (including +, -, *, /, and more) simply call methods. So 1 + 2 is the same as 1.+(2).

You may also want to whitelist op if it’s user input, e.g. %w[+ - * /].include?(op), as otherwise the user will be able to call arbitrary methods (which is a potential security vulnerability).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...