#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