|
ToDo:
|
家族揃ってみてきました。うん、面白かったと思いますよ。ちょー大物ミュージシャンがゲストで出てますね。以前はKeith Richardsが出ていましたね。
Factory method pattern - WikipediaのC#のコードを焼き直してみました。
FactoryでIPeronを返そうとするとsizeが未定だと怒られたのでBoxで包んじゃいました。
trait IPerson{
fn get_name(&self) -> String;
}
struct Villager;
impl IPerson for Villager{
fn get_name(&self) -> String{
"Village Person".to_string()
}
}
struct CityPerson;
impl IPerson for CityPerson{
fn get_name(&self) -> String{
"City Person".to_string()
}
}
enum PersonType{
Rural,
Urban
}
struct Factory;
impl Factory {
fn get_person(typ: PersonType) -> Box<IPerson> {
match typ {
PersonType::Rural => Box::new(Villager),
PersonType::Urban => Box::new(CityPerson),
}
}
}
fn main(){
let p1 = Factory::get_person(PersonType::Rural);
let p2 = Factory::get_person(PersonType::Urban);
println!("{}",p1.get_name());
println!("{}",p2.get_name());
}
今年は中止でしたー。
Command pattern - WikipediaをRustで実験。本当はもっtGenericsを使ったほうが良さそうなのだが。
trait Command {
fn execute(&self);
}
struct Switch<'a>{
closed_command: &'a Command,
opened_command: &'a Command
}
impl <'a>Switch<'a>{
fn new(cls: &'a Command, opn: &'a Command) -> Self{
Switch{
closed_command : cls,
opened_command : opn,
}
}
fn close(&self){
self.closed_command.execute();
}
fn open(&self){
self.opened_command.execute();
}
}
trait Switchable{
fn power_on(&self);
fn power_off(&self);
}
struct Light;
impl Switchable for Light{
fn power_on(&self){
println!("The light is on");
}
fn power_off(&self){
println!("The light is off");
}
}
struct CloseSwitchCommand<'a>{
switchable: &'a Switchable
}
impl<'a> CloseSwitchCommand<'a>{
fn new(cmd: &'a Switchable) -> Self{
CloseSwitchCommand{
switchable : cmd,
}
}
}
impl<'a> Command for CloseSwitchCommand<'a>{
fn execute(&self){
self.switchable.power_on();
}
}
impl<'a> OpenSwitchCommand<'a>{
fn new(cmd: &'a Switchable) -> Self{
OpenSwitchCommand{
switchable : cmd
}
}
}
impl<'a> Command for OpenSwitchCommand<'a>{
fn execute(&self) {
self.switchable.power_off();
}
}
use std::env;
use std::str;
fn main(){
let args: Vec<String> = env::args().collect();
let lamp = Light;
let switch_close = CloseSwitchCommand::new(&lamp);
let switch_open = OpenSwitchCommand::new(&lamp);
let switch = Switch::new(&switch_close,&switch_open);
let s: &str = &args[1];
match s{
"ON" => switch.open(),
"OFF" => switch.close(),
_ => println!("Argument ON or OFF is required!"),
}
}
Rustづいていたが並行してClojureも勉強するので計算機プログラムの構造と解釈 第2版を読んでいます。
ニュートン法で平方根を求めるのです。
iterateとlazy-seqでそれぞれ遅延評価を使っています。
修正しました。第一引数が有効数で第二引数が平方根で求める値です。初期値は1.で固定です。*1
(ns newton.core
(:gen-class))
(defn newton[[x y]]
(cons x (lazy-seq (newton [(/ (+' (/ y x) x ) 2) y]))))
(defn -main[& args]
(do
(println
(first
(first
(first
(filter
#(< (Math/abs (- (first (first %) ) (first (second %)))) (Float/parseFloat (first args)))
(partition 2 1
(iterate
(fn [[x y]] [(/ (+' (/ y x) x ) 2) y] ) [1. (Integer/parseInt (second args))])))))))
(println
(first
(first
(filter
#(< (Math/abs (- (first %) (second %))) (Float/parseFloat (first args)))
(partition 2 1 (newton [1. (Integer/parseInt (second args))]) )))))))
*1 8/23修正
普段はGNU Emacs - GNU ProjectかVisual Studio Code - Visual Studioです。
Atomも使ってみるかって気になりました
お勉強してます。
pub mod traitobject{
pub trait Foo{
fn method(&self) ->String;
}
impl Foo for u8 {
fn method(&self) -> String{
format!("Foo for U8: {}",self)
}
}
impl Foo for String{
fn method(&self) -> String{
format!("Foo for String: {}",self)
}
}
pub fn do_something<T: Foo> (x: T){
println!("Something = {}",x.method());
}
}
で
事前に宣言してmod名やtrailもそのまま使えるようにして
mod traitobject;
use traitobject::traitobject::Foo;
use traitobject::traitobject::do_something;
使っちゃいます。
fn main(){
do_something(127u8);
do_something("TraitObject Sample".to_string());
}
In Actionシリーズきたー