Действительно ли возможно добавить метод к встроенному типу в Scala?

Попробуй это. Вы хотите показать раскрывающееся значение в текстовом поле? Этот код будет отображать раскрывающееся значение в текстовом поле при изменении раскрывающегося значения и при нажатии кнопки показать. Я создал функцию showText (), которую вы можете вызывать в любом месте либо по нажатию кнопки показа, либо по изменению выпадающего списка. Вы можете изменить значения выпадающего меню, используя свой php while. Вот пример кода:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form method="POST">
    <select name="searchtitle" id="drp_dwn" onchange="showText()">
      <option value="one" >One</option>
      <option value="Two" >Two</option>
      <option value="Three" >Three</option>
    </select>     
    <input type="button" onclick="showText()" class="button" value="Show">
    <input type="text" id="textArea" class="product-new-textbox" name="searchtitle" value='' />
</form>
<script>
    function showText()
  {
    $("#textArea").val($("#drp_dwn").val()); 
  }
</script>
9
задан Rachel Gallen 23 July 2015 в 10:07
поделиться

2 ответа

Да и нет. Да, можно заставить его казаться на добавление метода к double. Например:

class MyRichDouble(d: Double) {
  def <>(other: Double) = d != other
}

implicit def doubleToSyntax(d: Double) = new MyRichDouble(d)

Этот код добавляет ранее недоступное <> оператор к любому объекту типа Double. Пока doubleToSyntax метод находится в объеме так, чтобы он мог быть вызван без квалификации, следующее будет работать:

3.1415 <> 2.68     // => true

Часть "нет" ответа прибывает из того, что Вы ничего действительно не добавляете к Double класс. Вместо этого Вы создаете преобразование из Double к новому типу, который действительно определяет метод, который Вы хотите. Это может быть намного более мощной техникой, чем открытые классы, предлагаемые многими динамическими языками. Это также, оказывается, абсолютно безопасно с точки зрения типов.:-)

Некоторые ограничения необходимо знать:

  • Эта техника не позволяет Вам удалять или переопределять существующие методы, просто добавляет новые
  • Неявный метод преобразования (в этом случае, doubleToSyntax) абсолютно должно быть в объеме, чтобы метод требуемого внутреннего абонента был доступен

Идиоматически, неявные преобразования или помещаются в одноэлементных объектах и импортируются (например. import Predef._) или в чертах и наследованный (например. class MyStuff extends PredefTrait).

Пренебрегите в стороне: "инфиксные операторы" в Scala являются на самом деле методами. Нет никакого волшебства, связанного с <> метод, который позволяет этому быть инфиксом, синтаксический анализатор просто, принимает его тот путь. Можно также использовать "обычные методы" в качестве инфиксных операторов, если Вам нравится. Например, Stream класс определяет a take метод, который берет сингл Int параметр и возвраты новое Stream. Это может использоваться следующим образом:

val str: Stream[Int] = ...
val subStream = str take 5

str take 5 выражение буквально идентично str.take(5).

18
ответ дан 4 December 2019 в 11:08
поделиться

Эта функция пригодилась для реализации класса, выполняющего оценку погрешности:

object errorEstimation {
  class Estimate(val x: Double, val e: Double) {
    def + (that: Estimate) =
      new Estimate(this.x + that.x, this.e + that.e)
    def - (that: Estimate) =
      new Estimate(this.x - that.x, this.e + that.e)
    def * (that: Estimate) =
      new Estimate(this.x * that.x,
                   this.x.abs*that.e+that.x.abs*this.e+this.e*that.e)
    def / (that: Estimate) =
      new Estimate(this.x/that.x,
                   (this.x.abs*that.e+that.x.abs*this.e)/(that.x.abs*(that.x.abs-that.e)))
    def +- (e2: Double) =
      new Estimate(x,e+e2)
    override def toString =
      x + " +- " + e
  }
  implicit def double2estimate(x: Double): Estimate = new Estimate(x,0)
  implicit def int2estimate(x: Int): Estimate = new Estimate(x,0)

  def main(args: Array[String]) = {
    println(((x: Estimate) => x+2*x+3*x*x)(1 +- 0.1))
    // 6.0 +- 0.93
    println(((x: Estimate) => (((y: Estimate) => y*y + 2)(x+x)))(1 +- 0.1))
    // 6.0 +- 0.84
    def poly(x: Estimate) = x+2*x+3/(x*x)
    println(poly(3.0 +- 0.1))
    // 9.33333 +- 0.3242352
    println(poly(30271.3 +- 0.0001))
    // 90813.9 +- 0.0003
    println(((x: Estimate) => poly(x*x))(3 +- 1.0))
    // 27.037 +- 20.931
  }
}
1
ответ дан 4 December 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: