factory 키워드를 사용하여 하나의 생성자만 있는 클래스는 확장이 안된다.

최근 플러터를 통하여 앱 프로젝트를 만들고 코딩하고있을때 있던 일이였다. 어플에 http통신을 구현할려고 하는데, dart언어에 기본적으로 httpclient 객체가 지원하고 있었다. 그래서 해당 객체의 자식클래스를 만들어서 코딩할려고 할려고 하니 갑자기 에러창이 뜨게 되었다. import "dart:io"; class Custom extends HttpClient {/*****/} //error message /*The class 'Custom' cannot extend 'HttpClient' because 'HttpClient' only has factory constructors (no generative constructors), and 'Custom' has at least one generative constructor. Try implementing the class instead, adding a generative (not factory) constructor to the superclass Custom, or a factory constructor to the subclass....

December 19, 2021

몇몇 타입이 구조체의 맴버변수를 리턴 못하는 이유

코딩하던 도중에, 구조체의 변수값을 리턴하는 함수를 만들던 도중에 있던일을 적을라고 한다. 일단 구조체에 있는 문자열 변수를 읽는 함수를 제작했다 하자. struct A { num : u32, s : String } impl A { fn get_string(&self) -> String { self.s } /***/ } fn main() { let object = A{num : 0,s : String::from("")}; let _copyS = object.get_string(); /***/ } 다른 언어에서 작성하던것처럼 문자열의 getter를 함수로 만들어 놓고 컴파일 해보니 이런 에러가 뜬다....

December 5, 2021

리시버 있는 함수 리터럴 유용한 사용

계기 코틀린으로 코딩하는도중 예전에 쓰던 exposed 프레임워크의 코드줄에서 궁금증이 생겼는데. import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.transactions.transaction object Users : Table() { ... val name = varchar("name", length = 50) ... } transaction { .... .... Users.update({ Users.name eq "city"}) { it[name] = "bob" } } 이라는 코드줄이 있다고 할때, User 싱글톤 객체에 name에 infix 함수인 eq가 있다. 그럼 이걸 update함수 밖에서 써도 될까에서 시작해서 그렇게 작성해서 컴파일 해봤는데. import org.jetbrains.exposed.sql.* import org.jetbrains.exposed.sql.transactions.transaction object Users : Table() { ....

November 25, 2021

코틀린 하면서 느낀 infix 유용함

코틀린으로 spring 프로젝트를 코딩하고 있는데, 데이터베이스를 사용해야해서 JetBrains(코틀린 만든회사)에서 만든 exposed 라는 sql프레임워크를 사용하게 되었다. 그렇게 해당 라이브러리로 테이블 객체를 만들고, select를 수행하는 함수에서 where 문을 추가해야 하는 상황에서 infix 함수를 사용하게 되었다. 일단 예시로 평소에 나는 이렇게 코딩하고 있었다 /* ... ... ... */ data class User : Table() (val name : String,val age : Int,/*..*/) data class NameAndAge(/*..*/) fun selectUser() : List<NameAndAge> { //select 안에 where 관련 기능이 추가된다....

November 23, 2021

모듈 임포트

러스트로 코딩하는도중, 소스코드를 분리할 필요성을 느껴 별도의 모듈로 만들고나서 임포트 할려고 할때, 해당 프로젝트안의 로컬 모듈들을 어떻게 임포트 하는지, 기억하기 힘들어 따로 이렇게 글을 작성할 필요성을 느꼇다. 러스트에서는 mod라는 키워드가 있는데, 해당 키워드는 두가지의 기능을 수행한다. c++.c#처럼 네임스페이스 비슷한 기능을 한다. 다른 모듈들을 인클루드 한다. 예시로 이런 코드가 있다고 치자 // path : src/main.rs /* similar c++ namespace module { void hello() { std::cout << "hello world" << std::endl; } }; int main() { module::hello(); return 0; } */ mod module { pub fn hello() { println!...

November 4, 2021

trait를 리턴하는 방법

러스트로 코딩하던 도중에 트레이드를 리턴해야하는 함수를 만들어야 하는 상황이 있었다. 그래서 go언어를 코딩하는것과 마찬가지로 리턴타입을 트레이드(go언어에선 인터페이스)로 하여 리턴 하는 함수를 작성후 컴파일 해본적이 있었는데 그때의 일을 적어볼려고 한다. //go 코드 예시 package main import "fmt" type Hi interface { hi() } type String struct { s string } func new_hi(s string) Hi { return &String{s} } func (s *String)hi() { fmt.Println("hi : "s.s) } func main() { var str = "sunken ahn" new_hi(str)....

October 30, 2021