Scala для пониманий: жизненная функция или синтаксический сахар?

Используя mysqli PHP драйвер, Вы не можете получить insert_id после фиксации.

действительное решение - это:

function add_post($post_data){
  $this->db->trans_begin();
  $this->db->insert('posts',$post_data);

  if( $this->db->trans_status() === FALSE )
  {
    $this->db->trans_rollback();
    return( 0 );
  }
  else
  {
    $item_id = $this->db->insert_id();
    $this->db->trans_commit();
    return( $item_id );
  }
}

Источник для структуры кода: https://codeigniter.com/user_guide/database/transactions.html#running-transactions-manually

19
задан Marcus Downing 6 September 2009 в 15:32
поделиться

4 ответа

См. этот вопрос . Короткий ответ заключается в том, что выражения for могут быть более читаемыми. В частности, если у вас много вложенных генераторов, фактический объем того, что вы делаете, становится более ясным, и вам не нужны огромные отступы.

14
ответ дан 30 November 2019 в 03:08
поделиться

Еще одно замечательное применение for-computing - это внутренний DSL. ScalaQL - отличный пример этого. Он может превратить это

val underAge = for { 
  p <- Person 
  c <- Company 
  if p.company is c 
  if p.age < 14 
} yield p 

в это

SELECT p.* FROM people p JOIN companies c ON p.company_id = c.id WHERE p.age < 14 

и многое другое.

11
ответ дан 30 November 2019 в 03:08
поделиться

for-complation - это синтаксический сахар, но это не значит, что они не являются жизненно важными. Обычно они более лаконичны, чем их развернутая форма, что приятно, но, возможно, что более важно, они помогают программистам, использующим императивные языки, использовать функциональные конструкции.

Когда я впервые начал работать со Scala, я часто использовал for-computing, потому что они были мне знакомы. Затем я почти полностью остановился, потому что почувствовал, что использование основных методов было более явным и, следовательно, более ясным. Теперь я вернулся к использованию for-computing, потому что считаю, что они лучше выражают намерение того, что я делаю, а не способы его выполнения.

10
ответ дан 30 November 2019 в 03:08
поделиться

Вы правы. Понимание - это синтаксический сахар. Я считаю, что лежащие в основе методы более лаконичны и легче читаются, как только вы к ним привыкнете.

Сравните следующие эквивалентные утверждения:

1. for (i <- 1 to 100; if (i % 3 == 0)) yield Math.pow(i, 2)
2. (1 to 100).filter(_ % 3 == 0).map(Math.pow(_, 2))

На мой взгляд, добавление точки с запятой в № 1 отвлекает от ощущения, что это представляет собой одноцепочечное утверждение. Также есть ощущение, что i - это переменная (это 1, или 99, или что-то среднее?), Что отвлекает от в остальном функционального стиля.

Вариант 2 более очевидно представляет собой цепочку вызовов методов для объектов. Каждое звено в цепочке четко заявляет о своей ответственности. Здесь нет промежуточных переменных.

Возможно, для понимания включены для удобства разработчиков, переходящих с Java. Независимо от того, какой вариант будет выбран, зависит от стиля и предпочтений.

3
ответ дан 30 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

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