Вызывать метод динамически на основе параметра в Scala

#scala

#scala

Вопрос:

у меня есть класс ниже в scala

  class A(arg:String){

 // this method is going to call many time 
 def exce():String ={
 // i do not want to use if else here
 if("arg"=="a1")
 a1("abc")
 if("arg"=="a1")
  a2("abc")
 }
 def a1(arg1:String):String={
 "in a1"
 }
 def a2(arg1:String):String={
 "in a2"
 }
 }
  

Теперь я создам экземпляр класса A и передам значение arg в качестве имени метода
как я могу вызвать метод «exce», и метод exce вызовет a1 или a2 на основе аргументов
например
новый A(«a1»).exce() — вывод будет a1
как этого добиться, не используя if else в методе «exce»

может ли кто-нибудь помочь здесь

Ответ №1:

Если я правильно понял.Я думаю, это решило бы ваш вариант использования :

 class A(arg:String){
  def exce():String = arg match{
    case "a1"=>a1("abc")
    case "a2"=>a2("abc")
  }

  def a1(arg1:String):String={
    "in a1"
  }
  def a2(arg1:String):String={
    "in a2"
  }
}
  

Теперь, когда вы вызываете new A("a1").exec()
Затем он выдает in a1

Комментарии:

1. это будет проблемой, но здесь, если я вызову a1 миллион раз, это будет миллион раз в операторе case, я искал что-то, где

2. это будет проблемой, но здесь, если я буду вызывать a1 миллион раз, это будет миллион раз, в инструкции case я искал что-то, где val obj= new A («a1») и obj.exe () теперь exec должен логически определять имя метода при создании экземпляра класса A, и когда я буду вызывать exce миллион раз, он уже знает, какой метод нужно вызывать, и нет необходимости обращаться к нему каждый раз

Ответ №2:

Прежде всего, ваши методы a1,a2,exec являются общедоступными, но почему вы хотите иметь косвенный способ вызова like exec()->a1() or a2() ? .Я предполагаю, что вы пропустили добавление private в a1 и a2 . если exec метод будет вызываться много раз, то вы должны передать свое имя метода как exec (name: Строка).Это означает, что вам нужно создать новый экземпляр A, если вы собираетесь вызвать новый метод. Сопоставление с шаблоном было бы вашей альтернативой if-else

 class A{

  private def a1(arg1: String): String = {
    "in a1"
  }
  private def a2(arg1: String): String = {
    "in a2"
  }

  def exec(funName: String): String = {

    funName match {
 //You can think about passing input param "abc" from caller as well.
      case "a1" => a1("abc")
      case "a2" => a2("abc")
    }

  }

}

object Main extends App {

val a =new A()
println(a.exec("a1"))
println(a.exec("a2"))

}
  

Результат :

в a1

в a2

В качестве альтернативы вы можете указать свои аргументы как val, если не хотите передавать их как параметр метода

     class  A(val args:String){
    
    // your a1,a2 methods goes here

 def exec(): String = {

    args match {
 //You can think about passing input param "abc" from caller as well.
      case "a1" => a1("abc")
      case "a2" => a2("abc")
    }
    }
    
    object Main extends App {
    
    val a =new A("a1")
    println(a.exec())
    a.args = "a2"
    println(a.exec())
    
    }
  

Результат :

в a1

в a2