手続きと閉包
ここでは手続きまたは関数ともに純粋なものを扱う。
- 関数は渡される引数が同じであれば常に同じ値を返す
- 関数は変動する外部の変数を参照しない
- 関数には副作用がない
module Memoize | |
def memoize(*names) | |
names.each do |name| | |
target = instance_method(name) | |
wrapped = lambda do |arg| | |
@_cache_ ||= {} | |
@_cache_[name] ||= {} | |
@_cache_[name][arg] || @_cache_[name][arg] = target.bind(self).call(arg) | |
end | |
define_method name, &wrapped |
fact = lambda { | |
|pr, x| x * pr.((x - 1), pr) | |
}.curry.(lambda {|x, pr| x <= 0 ? 1 : x * pr.((x - 1), pr) }) | |
a = Class.new.instance_exec(fact) do |fact| | |
define_method(:fact, fact) | |
self | |
end.new | |
p a.fact 5 |
def pass_env(x = 9) | |
binding | |
end | |
def closure(y = 3) | |
Proc.new { y } | |
end | |
pass_env closure do |cl| | |
cl.call |
def closure(x = 3) | |
Proc.new { x } | |
end | |
a = closure | |
a.call #=> 3 | |
a.binding.eval "x" #=> 3 |
<?php | |
class RbArray | |
{ | |
function __construct(){ | |
$this->array = $this->get_val(func_get_args()); | |
} | |
private function get_val($val){ | |
if(is_array($val) && is_array($val[0])){ | |
return $this->get_val($val[0]); |
require 'weather_jp' | |
WeatherJp.parse "東京の今日の天気" | |
#=> #<DayWeather:@city_name = 東京都 東京, @day=今日, @forecast=曇り, @max_temp=25, @min_temp=20, @rain=30> | |
WeatherJp.parse("今日のうどん県の天気教えて下され〜〜").to_s | |
#=> "香川県 高松の今日の天気は曇のち晴 最高気温25度 最低気温17度 降水確率は20% です。" |
## Simple Usage | |
# creat weather object in differrnt ways | |
tokyo = WeatherJp.get :tokyo | |
tokyo = WeatherJp.get "東京都府中市" | |
minato = WeatherJp::Weather.new("東京都港区") | |
# get weather info as String | |
tokyo.today.to_s | |
#=> can be "東京都 東京の天気は曇りのち晴れ、最高気温34度...etc" |
# Ruby install 覚え書き | |
# gcc make gcc-c++ zlib-devel httpd-devel openssl-devel curl-devel libreadline-dev readline-dev あたりがはいっているか確認 | |
# install rbenv | |
$ cd | |
$ git clone git://github.com/sstephenson/rbenv.git .rbenv | |
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc | |
$ echo 'eval "$(rbenv init -)"' >> ~/.bashrc | |
$ source ~/.bashrc |
# -*- encoding:utf-8 -*- | |
# | |
# Usage | |
# | |
# tokyo = Weather.new :tokyo | |
# okinawa = Weather.new("沖縄") | |
# fuchu = Weather.new("東京都府中市") | |
# | |
# puts fuchu.get_weather(:today).to_s | |
# puts fuchu.get_weather(0).to_s |