主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Boo: 匿名関数でクロージャ

                
http://elicon.blog57.fc2.com/blog-entry-259.html

以前にBooでクロージャを作ったところ予期していない値を得た。WPFを使った小さいサンプルプログラムを書いて、Booではどうクロージャを書くかのメモとする。

Booのスコープがどうなっているかは前回で触れた。下記はダメ。前回触れたとおりブロックスコープではないので、各ループでのfileへの参照が同じものになってしまう。
files = GetFiles()

for x in range(files.Length):
file = files[x]
button as Button = Button()
button.Content = file.Name
button.Height = 23
button.Click += def(sender as object, e as RoutedEventArgs):
print(file.Name)
mediaEl.Source = Uri(file.FullName)

stackPanel.Children.Add(button)


下記2つはオーケーな書き方。forによってインクリメントされる変数のスコープが、それぞれのループのなかでしか有効でないため、参照されるfileやxが同一の値にはならない。
files = GetFiles()

for x in range(files.Length):
button as Button = Button()
button.Content = files[x].Name
button.Height = 23
button.Click += def(sender as object, e as RoutedEventArgs):
print(files[x].Name)
mediaEl.Source = Uri(files[x].FullName)

stackPanel.Children.Add(button)


files = GetFiles()

for x, file as FileInfo in enumerate(files):
button as Button = Button()
button.Content = file.Name
button.Height = 23
button.Click += def(sender as object, e as RoutedEventArgs):
print(file.Name)
mediaEl.Source = Uri(file.FullName)

stackPanel.Children.Add(button)



Window1.xaml.boo
namespace BooWPF2

import System
import System.Windows
import System.Windows.Controls
import System.Windows.Markup
import System.IO
import System.Environment
import System.Xml

def GetFiles():
myVideo = GetFolderPath(SpecialFolder.MyVideos)
files = DirectoryInfo(myVideo).GetFiles("*.wmv", SearchOption.AllDirectories)
return files

class Window1:
public window as Window
def constructor():
streamReader = StreamReader("Window1.xaml")
xmlreader = XmlReader.Create(streamReader)
window = XamlReader.Load(xmlreader)
mediaEl = LogicalTreeHelper.FindLogicalNode(window, "mediaEl") as MediaElement
stackPanel = LogicalTreeHelper.FindLogicalNode(window, "stackPanel") as StackPanel
files = GetFiles()

// for x in range(files.Length):
// file = files[x]
// button as Button = Button()
// button.Content = file.Name
// button.Height = 23
// button.Click += def(sender as object, e as RoutedEventArgs):
// print(file.Name)
// mediaEl.Source = Uri(file.FullName)
//
// stackPanel.Children.Add(button)

for x, file as FileInfo in enumerate(files):
button as Button = Button()
button.Content = file.Name
button.Height = 23
button.Click += def(sender as object, e as RoutedEventArgs):
print(file.Name)
mediaEl.Source = Uri(file.FullName)

stackPanel.Children.Add(button)

// for x in range(files.Length):
// button as Button = Button()
// button.Content = files[x].Name
// button.Height = 23
// button.Click += def(sender as object, e as RoutedEventArgs):
// print(files[x].Name)
// mediaEl.Source = Uri(files[x].FullName)
//
// stackPanel.Children.Add(button)


Window1.xaml
<?xml version="1.0" encoding="utf-8"?>
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="BooWPF2"
Height="600"
Width="300"
ResizeMode="CanResize">
<StackPanel
Name="stackPanel">
<MediaElement
Name="mediaEl"
Width="200"
Height="150"
LoadedBehavior="Play"
UnloadedBehavior="Close" />
</StackPanel>
</Window>


Program.boo
import System
import System.Windows

import BooWPF2

[STAThread]
def Main():
w = Window1()
w.window.Show()
Application().Run()


            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。