2016년 11월 4일 금요일

Rust 변경사항 살펴보기 :

## RFC 1624 : loop-break-value

https://github.com/rust-lang/rfcs/blob/master/text/1624-loop-break-value.md

break가 value를 가질 수 있게 하고 loop가 리턴값을 가질 수 있게 한다.

break는 아래의 4가지가 가능해진다.(label은 loop의 이름이고 EXPR은 expression을 의미)

1. break;
2. break 'label;
3. break EXPR;
4. break 'label EXPR;

loop의 리턴 타입

1. break가 없으면 리턴하지 않는다는 것을 의미하는 !가 된다.
2. break가 있으면 ()가 리턴값이 된다.
3. break EXPR이 있으면 EXPR의 타입이 리턴타입이 된다.

위의 내용을 적용함으로서 코드가 아래처럼 간결해 질 수 있다.

// without loop-break-value:
let x = {
    let temp_bar;
    loop {
        ...
        if ... {
            temp_bar = bar;
            break;
        }
    }
    foo(temp_bar)
};

// with loop-break-value:
let x = foo(loop {
        ...
        if ... { break bar; }
    });

## RFC 1682 : field-init-shorthand

https://github.com/rust-lang/rfcs/blob/master/text/1682-field-init-shorthand.md

named field를 가지는 struct와 union과 enum에서 초기화 시 field가 같은 이름을 가지는 경우 'field: field' 대신 'field'를 사용할 수 있도록 한다.

위의 내용을 적용함으로서 코드가 아래처럼 간결해 질 수 있다.

struct SomeStruct { field1: ComplexType, field2: AnotherType }

impl SomeStruct {
    fn new() -> Self {
        let field1 = {
            // Various initialization code
        };
        let field2 = {
            // More initialization code
        };
        SomeStruct { field1, field2 }
    }
}

## RFC 1665 : windows-subsystem

https://github.com/rust-lang/rfcs/blob/dd3ba8ec65f02c7742c75c7a25d5ce2c49fa5012/text/1665-windows-subsystem.md

현재의 rust program은 Windows에서 실행될 때 항상 console을 띄운다. 이것은 Windows가 CONSOLE subsystem은 main을 entry point로 하고 WINDOWS subsytem은 WinMain을 entry point로 하는데, rust program은 항상 main이 entry point이기 때문이다.

이 문제의 해결을 위해 아래와 같은 attribute를 새로 추가한다.

#![windows_subsystem = "windows"]

여기서 가능한 값은 {windows, console} 이고 나중에 더 추가될 수도 있다.

위 attribute에서 subsystem이 "windows" 이면 "/ENTRY:mainCRTStartup" 을 linker option에 추가함으로서 WINDOWS subsystem의 경우에 main을 entry point로 사용하면서 console이 뜨지 않도록 한다.

## RFC 1725 : unaligned access

https://github.com/rust-lang/rfcs/blob/master/text/1725-unaligned-access.md

unaligned pointer에서 reading/writing을 할 수 있는 ptr::read_unaligned와 ptr::write_unaligned를 추가한다.

사실 위 두 함수의 구현은 ptr::copy_nonoverlapping
의 wrapper이다. 따라서, ptr::copy_nonoverlapping를 직접 사용해도 된다. 그래도 위의 두 함수가 사용하기 더 편리하기도 하고 좀 더 직관적이다.

## RFC 1566 : procedural macros

## RFC 1647 : allow self in where clauses

타입이 trait의 implementations의 어떤 위치에서든 사용이 가능하도록 한다.
impl SomeTrait for SomeType where Self: SomeOtherTrait { }

impl SomeTrait<Self> for SomeType { }

impl SomeTrait for SomeType where SomeOtherType<Self>: SomeTrait { }

impl SomeTrait for SomeType where Self::AssocType: SomeOtherTrait {
    AssocType = SomeOtherType;
}

하지만 아래는 안된다.
// The error here is because this would be Vec<Vec<Self>>, Vec<Vec<Vec<Self>>>, ...
impl SomeTrait for Vec<Self> { }

## RFC 1414 : rvalue static promotion

constexpr rvalues를 static memory에 values로 promote한다.

function body's block에서 아래의 조건이 맞으면
* constexpr rvalue에의 shared reference를 취하는 경우(&<constexpr>)
* constexpr이 UnsafeCell { ... } 생성자를 포함하고 있지 않은 경우
* constexpr이 UnsafeCell을 포함하는 타입을 리턴하는 const fn call을 포함하고 있지 않은 경우
rvalue를 static memory location으로 translate 하고 resulting reference 'static lifetime을 준다.

예는 아래와 같다.
// OK:
let a: &'static u32 = &32;
let b: &'static Option<UnsafeCell<u32>> = &None;
let c: &'static Fn() -> u32 = &|| 42;

let h: &'static u32 = &(32 + 64);

fn generic<T>() -> &'static Option<T> {
    &None::<T>
}

// BAD:
let f: &'static Option<UnsafeCell<u32>> = &Some(UnsafeCell { data: 32 });
let g: &'static Cell<u32> = &Cell::new(); // assuming conf fn new()

## RFC 1651 : movecell

Cell이  non-Copy타입하고도 잘 동작하도록 확장한다.

이에 따라 get 함수는 Copy 타입에만 동작하도록 변경되고, 추가되는 함수들이 있다.
impl<T> Cell<T> {
    fn set(&self, val: T);
    fn replace(&self, val: T) -> T;
    fn into_inner(self) -> T;
}

impl<T: Copy> Cell<T> {
    fn get(&self) -> T;
}

impl<T: Default> Cell<T> {
    fn take(&self) -> T;
}

## RFC 1584 : macros

Declarative macros 2.0. macro_rules!에의 교체

// Syntax (TBA)

macro foo($a: ident) => {
    return $a + 1;
}

## RFC 1558 : closure to fn coercion


댓글 없음:

댓글 쓰기

Building asynchronous views in SwiftUI 정리

Handling loading states within SwiftUI views self loading views View model 사용하기 Combine을 사용한 AnyPublisher Making SwiftUI views refreshable r...