我是scala的新手,我正在尝试对列表的元素运行操作,我想将结果添加到同一列表的末尾。
现在我有
func(pos - 1 , list) :: func(pos - 1 , list).takeRight(2).sum
完成这项工作,但非常难看并且两次调用“func”。我宁愿有类似的东西:
func(pos - 1 , list).<somefunction>.takeright(2).sum
但我不确定该怎么做。
答案 0 :(得分:1)
我不明白为什么你的工作代码应该是丑陋的,但是你可以通过将结果存储在局部变量中来消除冗余的方法调用。看起来您想要将最后两个项目的总和附加到列表中,因此您可能希望使用function kia_get_car_names_checkout_options(){
$args = array(
'author' => get_current_user_id(),
'posts_per_page' => -1,
'orderby' => 'post_title',
'order' => 'ASC',
'post_type' => 'car',
'post_status' => 'publish' );
$posts = get_posts( $args );
$car_names = wp_list_pluck( $posts, 'post_title', 'ID' );
return $car_names;
}
// Add a new checkout field
function kia_filter_checkout_fields($fields){
$fields['extra_fields'] = array(
'another_field' => array(
'type' => 'select',
'options' => kia_get_car_names_checkout_options(),
'required' => true,
'label' => __( 'Another field' )
)
);
return $fields;
}
add_filter( 'woocommerce_checkout_fields', 'kia_filter_checkout_fields' );
// display the extra field on the checkout form
function kia_extra_checkout_fields(){
$checkout = WC()->checkout(); ?>
<div class="extra-fields">
<h3><?php _e( 'Additional Fields' ); ?></h3>
<?php
// because of this foreach, everything added to the array in the previous function will display automagically
foreach ( $checkout->checkout_fields['extra_fields'] as $key => $field ) : ?>
<?php woocommerce_form_field( $key, $field, $checkout->get_value( $key ) ); ?>
<?php endforeach; ?>
</div>
<?php }
add_action( 'woocommerce_checkout_after_customer_details' ,'kia_extra_checkout_fields' );
运算符而不是:+
,但请记住,追加需要线性时间而前置到列表是不变的,所以你应该更喜欢后者。
所以你能做的就是
::
但是,为了向您展示Scala中可以完成的任务,这里有一个更接近您想要的输出的示例:
val intermediate: List[Int] = func(pos - 1, list)
intermediate :+ intermediate.takeRight(2).sum
通过定义隐式类,您可以模拟更丰富的接口,并将新方法def main(args: Array[String]) {
println(func(4, Nil).append(_.takeRight(2).sum)) // List(1, 2, 3, 5)
}
def func(i: Int, l: List[Int]): List[Int] = List(1, 2, 3)
implicit class PimpMyList(list: List[Int]) {
def append(f: List[Int] => Int): List[Int] = {
list :+ f(list)
}
}
添加到append
的接口。请注意,现在,List
只是list.append(x)
的隐式语法。 new PimpMyList(list).append(x)
采用将append
转换为List[Int]
的函数,因此我们可以根据需要使用函数Int
调用它。
请注意,我们也可以将隐式类设为通用:
x => x.takeRight(2).sum
答案 1 :(得分:0)
您可以使用match
将某些转换应用于某个表达式的结果:
List(1,2,3) match {
case x => x :+ x.takeRight(2).sum
}
//>> List(1, 2, 3, 5)