質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

6864閲覧

ラムダ式でメソッドを抜ける処理は不可?

nyahonyaho

総合スコア83

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/02/06 00:47

boolean hogeFlg = false; if (hogeFlg){ return; }else{ hogeFlg = false; };

このソースを汎用関数インタフェースにラムダ式を使った一文で入れたいのですが、Returnをラムダに入れると当然ラムダ部分の別メソッドとしてのReturnとして認識され、結果なにもしないことになります。
どうしましょ・・・

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/02/06 00:53

動かなくてもいいので、完成イメージのコードを書いてもらえますか?
guest

回答3

0

こんにちは。
質問から情報を削りすぎで質問内容が理解できません。
「ラムダ式でメソッドを抜ける」「汎用関数インタフェースにラムダ式を使った一文で入れたい」というのは文章の意味が通っていませんし、そもそも汎用関数インターフェースというのがなんなのかも質問文には書かれていません。
「boolean hogeFlg = false;」というのはメンバ変数でしょうか?であれば、ラムダ式に入れるソースではないと思いますが。

何を聞きたいのか多大に推測しつつ回答してみます。
「ラムダ式を記述している元の関数の処理を、ラムダ式の中の記述を用いて中断できるか」という意味でいいんでしょうか?
これは不可能です。
ラムダ式は記述こそ関数内に書かれているものですが、その実体はメソッドそのものです。メソッドが呼び出し元のメソッドを中断させるには、例外を発生させるくらいしかありません。
さらに言えば、ラムダ式を特定の関数に渡したからといって、「そのラムダ式が関数内で実行されるとは限らない」ということを忘れています。実行されるかどうかも渡した先に依存しているのに、それを使って制御構造を構築するのは無理がありすぎです。

本当は「それを使って何をしたいのか」が質問からは読み取れないため、申し訳ないですがこれ以上の回答は不可能です。
なんとなくですが、普通は戻り値や例外などを正しく使って制御構造を組むべき場面のように見えますが、そういう意味なら、ここでラムダ式を何らかの処理に使うこと自体がそもそも不適切だということになります。

投稿2017/02/06 01:17

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2017/02/06 03:49

自分自身もこの疑問には最初ぶつかりました。for文をLINQで置き換えていこうとするとcontinue, breakが書けなくて詰まるためです。そして最終的には > ここでラムダ式を何らかの処理に使うこと自体がそもそも不適切 ということなのだなわかり、for文はすべてLINQ化すればいいものではないということだよなということで落ち着きました。 ただ、LINQ化しにくいfor文というのは、何かロジックの組み方に不自然なところがあるのではないか、ともう一歩引いた目線で見直すきっかけにしてもいいとは思います。
tamoto

2017/02/06 04:13

なるほどLinqへのリプレースは分かりやすい例ですね。ラムダ式を制御構造に組み込みたいという感覚が少し見えました。for文が「何らかの処理にコレクションを利用する」立場で書かれているパターンだけは、「コレクションに対して何らかの処理を行う」仕組みであるLinq+foreachへのリプレースができないんですよね。そのタイプのfor文はどれもメンテナンス性に難があるイメージがあります……。
ozwk

2017/02/06 04:32

LINQ/foreachに置き換えにくいループを頑張って置き換えるのも 実用性はともかくパズルみたいで面白いですよね。
tamoto

2017/02/06 04:53

わかります、Rxだけで全ての処理を行う縛りとかも楽しいですよね! for文で書く前提でロジックが組まれていると、本文だけでなく周りの細かいメソッドも巻き込まないと置き換えられなかったりするんですよねえ。まあそういう処理をさっさとまとめてリファクタリングするのは品質も上がるし積極的にやるべきだと思いますね。そして最終的にfor文は原則使用禁止という暴挙に出ます。
guest

0

ベストアンサー

何がしたいのかよくわからなかったのですが
もし、

C#

1void NiceMethod(Action action){ 2 action(); 3 Console.WriteLine("hogehoge"); 4}

C#

1NiceMethod(()=>{ 2/* 3ここの記述をどうにかして 4Console.WriteLine("hogehoge");を 5飛ばしたい 6*/ 7});

ということであれば無理です。

素直にatcionに戻り値を持たせて判定しましょう。

(例外投げれば抜けられますが、その例外の使い方は褒められたものじゃないです。)

投稿2017/02/06 01:16

編集2017/02/06 01:21
ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyahonyaho

2017/02/06 01:42

説明不足ですいません・・・知りたかったことはまさしくそれです。 ありがとうございました。
guest

0

ozwkさんの話であれば、逆にコールバック関数として、後続処理をラムダで渡すのがいいと思います。

C#

1Main(){ 2 Fuga(()=>Console.WriteLine("hogehoge")); 3} 4 5void Fuga(Action collback){ 6 // 条件を満たさないときは後続処理が実行されない。 7 if ! IsSomeDicision() return; 8 collback(); 9}

投稿2017/02/06 03:55

iwamoto_takaaki

総合スコア2883

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問