2016-10-07 3 views
2
trait MyFunctionTrait extends ((Int, Int) => Double) 

class MyFunction1 extends MyFunctionTrait { 
    override def apply(a: Int, b: Int) => Double = a/b 
} 

object MyFunction2 extends MyFunctionTrait { 
    override def apply(a: Int, b: Int) => Double = a/b 
} 

Я не совсем уверен, какой из них следует использовать. Различия в том, как их запустить?Scala Функции как объекта против класса

scala> val f = new MyFunction1 
f: MyFunction1 = <function2> 

scala> f(1,2) 
res50: Double = 0.0 

scala> MyFunction2(1,2) 
res48: Double = 0.0 

Я действительно знаю, в чем разница между одноэлементным объектом и классом. Я хочу знать варианты использования в конкретном случае определения функции. Функция объясняется в статьях, но я видел, что она запрограммирована как класс и как объект, поэтому я хотел бы знать, что такое лучшая практика, когда и почему.

В моем конкретном случае я хочу дать еще одну функцию в качестве параметра функции в стиле Карринг, а затем имеют различную MyFunction, которые делают немного разные вещи в зависимости от того, какие функции они получили: How to write a currying Scala Function trait?

Пожалуйста, ответьте на 1) общий случай, 2) частный случай.

PS: Я попытался отделить вопрос о том, как карри и класс или объект - похоже, не работает так хорошо, прямо здесь.

+0

Возможный дубликат [Разница между объектом и классом в Scala] (http://stackoverflow.com/questions/1755345/difference-between-object-and-class-in- scala) – Dima

+1

@ Dima: Мое редактирование разъясняло, что я хочу знать? – Make42

+0

Что не так с 'val myFunction3: (Int, Int) => Double = (a, b) => a/b'? –

ответ

2

Это зависит от того, что вы пытаетесь сделать!


apply() функция в Скале просто синтаксический сахар [1, 2], что позволяет использовать MyObject(x) как сокращение для MyObject.apply(x).

Объект в scala - одноэлементный, что означает, что не более чем один экземпляр класса. Следовательно, вы можете позвонить MyFunction2(1,2).

Класс - тип с известными полями и функциями. Это определение того, что вы пытаетесь моделировать с помощью своего кода. Следовательно, вы не можете позвонить MyFunction1(1,2), так как вам нужен экземпляр класса для доступа к его полям и функциям.


Это, как говорится, может потребоваться переосмыслить то, что вы пытаетесь сделать. Классы и объекты в этом смысле - простые математические функции, где вы определяете объект x, объект y, ..., а затем используете x (...) и y (...). То, что вы хотели бы создать, - это либо класс, либо объект (например, singleton class), где вы определяете свои функции, например.

object Calculator { 

    def add(a: Int, b:Int): Int = { 
     return a + b 
    } 

    def subtract(a: Int, b: Int): Int = { 
     return a - b 
    } 

} 

который вы можете использовать для вызова своих функций, например. Calculator.add(2,3).

или

class Calculator { 

    def add(a: Int, b: Int): Int = { 
     return a + b 
    } 
} 

, который вы будете использовать также

val calc = new Calculator 
calc.add(3,2) 

Опять же, вы обнаружите, что вы можете использовать object Calculator без создания экземпляра. Вы можете сравнивать поля и параметры, определенные в объекте Scala со статическими полями класса Java, к которым вы также можете обращаться, не создавая экземпляр объекта класса. Который из вас должен полностью зависеть от того, что вы пытаетесь запрограммировать.Чтобы узнать, вы можете прочитать Difference between object and class in Scala

+1

Я уточнил свой вопрос: может быть, я много думаю из аспекта вопроса ...? – Make42

Смежные вопросы